Android에서 ListView에 요소를 동적으로 추가하려면 어떻게 해야 합니까?
안드로이드에서 동적으로 만들기 위한 튜토리얼을 설명하거나 제안할 수 있는 사람이 있습니까?
제 요구 사항은 다음과 같습니다.
- 버튼을 눌러 새로운 요소를 동적으로 추가할 수 있어야 합니다.
- 이해하기에 충분히 간단해야 합니다(예를 들어 성능 개선이나 View 변환이 필요하지 않을 수 있음).
이 주제에 대한 질문이 꽤 많다는 것을 알지만, 제 질문에 대한 답을 찾을 수 없었습니다.
프로젝트에서 XML 레이아웃을 먼저 만듭니다.res/layout/main.xml
폴더:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<Button
android:id="@+id/addBtn"
android:text="Add New Item"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:onClick="addItems"/>
<ListView
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:drawSelectorOnTop="false"
/>
</LinearLayout>
이것은 상단에 버튼이 있고 하단에 목록 보기가 있는 간단한 레이아웃입니다.참고:ListView
아이디가 있습니다.@android:id/list
기본값을 정의합니다.ListView
a ListActivity
사용할 수 있습니다.
public class ListViewDemo extends ListActivity {
//LIST OF ARRAY STRINGS WHICH WILL SERVE AS LIST ITEMS
ArrayList<String> listItems=new ArrayList<String>();
//DEFINING A STRING ADAPTER WHICH WILL HANDLE THE DATA OF THE LISTVIEW
ArrayAdapter<String> adapter;
//RECORDING HOW MANY TIMES THE BUTTON HAS BEEN CLICKED
int clickCounter=0;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
adapter=new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1,
listItems);
setListAdapter(adapter);
}
//METHOD WHICH WILL HANDLE DYNAMIC INSERTION
public void addItems(View v) {
listItems.add("Clicked : "+clickCounter++);
adapter.notifyDataSetChanged();
}
}
android.R.layout.simple_list_item_1
는 Android에서 제공하는 기본 목록 항목 레이아웃이며, 복잡한 것이 아닌 경우 이 재고 레이아웃을 사용할 수 있습니다.
listItems
목록 보기에 표시된 데이터가 들어 있는 목록입니다.모든 삽입 및 제거 작업은 다음에서 수행해야 합니다.listItems
의 변화listItems
보기에 반영되어야 합니다.그것은 에 의해 처리됩니다.ArrayAdapter<String> adapter
다음을 사용하여 통지해야 합니다.
adapter.notifyDataSetChanged();
어댑터는 세 가지 매개 변수로 인스턴스화됩니다. 컨텍스트는 다음과 같을 수 있습니다.activity/listactivity
개별 목록 항목의 레이아웃, 마지막으로 목록에 표시할 실제 데이터인 목록을 나타냅니다.
대신에
listItems.add("New Item");
adapter.notifyDataSetChanged();
직접 전화하실 수 있습니다.
adapter.add("New Item");
먼저 listView, EditText 및 버튼을 activity_main.xml에 추가해야 합니다.
이제 활동 기본:
private EditText editTxt;
private Button btn;
private ListView list;
private ArrayAdapter<String> adapter;
private ArrayList<String> arrayList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editTxt = (EditText) findViewById(R.id.editText);
btn = (Button) findViewById(R.id.button);
list = (ListView) findViewById(R.id.listView);
arrayList = new ArrayList<String>();
// Adapter: You need three parameters 'the context, id of the layout (it will be where the data is shown),
// and the array that contains the data
adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_spinner_item, arrayList);
// Here, you set the data in your ListView
list.setAdapter(adapter);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// this line adds the data of your EditText and puts in your array
arrayList.add(editTxt.getText().toString());
// next thing you have to do is check if your adapter has changed
adapter.notifyDataSetChanged();
}
});
}
이 일은 제게 도움이 됩니다. 제가 도와드렸기를 바랍니다.
ListActivity 대신 AppCompativity에서 ListView를 사용하려면 다음을 수행할 수 있습니다(Modifying @Shardul의 답변).
public class ListViewDemoActivity extends AppCompatActivity {
//LIST OF ARRAY STRINGS WHICH WILL SERVE AS LIST ITEMS
ArrayList<String> listItems=new ArrayList<String>();
//DEFINING A STRING ADAPTER WHICH WILL HANDLE THE DATA OF THE LISTVIEW
ArrayAdapter<String> adapter;
//RECORDING HOW MANY TIMES THE BUTTON HAS BEEN CLICKED
int clickCounter=0;
private ListView mListView;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.activity_list_view_demo);
if (mListView == null) {
mListView = (ListView) findViewById(R.id.listDemo);
}
adapter=new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1,
listItems);
setListAdapter(adapter);
}
//METHOD WHICH WILL HANDLE DYNAMIC INSERTION
public void addItems(View v) {
listItems.add("Clicked : "+clickCounter++);
adapter.notifyDataSetChanged();
}
protected ListView getListView() {
if (mListView == null) {
mListView = (ListView) findViewById(R.id.listDemo);
}
return mListView;
}
protected void setListAdapter(ListAdapter adapter) {
getListView().setAdapter(adapter);
}
protected ListAdapter getListAdapter() {
ListAdapter adapter = getListView().getAdapter();
if (adapter instanceof HeaderViewListAdapter) {
return ((HeaderViewListAdapter)adapter).getWrappedAdapter();
} else {
return adapter;
}
}
}
사용하는 대신 레이아웃에서android:id="@android:id/list"
사용할 수 있습니다.android:id="@+id/listDemo"
그래서 이제 당신은 가질 수 있습니다.ListView
정상의 내부에서.AppCompatActivity
.
MainActivity.java 파일의 코드입니다.
public class MainActivity extends Activity {
ListView listview;
Button Addbutton;
EditText GetValue;
String[] ListElements = new String[] {
"Android",
"PHP"
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listview = (ListView) findViewById(R.id.listView1);
Addbutton = (Button) findViewById(R.id.button1);
GetValue = (EditText) findViewById(R.id.editText1);
final List < String > ListElementsArrayList = new ArrayList < String >
(Arrays.asList(ListElements));
final ArrayAdapter < String > adapter = new ArrayAdapter < String >
(MainActivity.this, android.R.layout.simple_list_item_1,
ListElementsArrayList);
listview.setAdapter(adapter);
Addbutton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ListElementsArrayList.add(GetValue.getText().toString());
adapter.notifyDataSetChanged();
}
});
}
}
activity_main.xml 레이아웃 파일의 코드입니다.
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.listviewaddelementsdynamically_android_examples
.com.MainActivity" >
<Button
android:id="@+id/button1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/editText1"
android:layout_centerHorizontal="true"
android:text="ADD Values to listview" />
<EditText
android:id="@+id/editText1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="26dp"
android:ems="10"
android:hint="Add elements listView" />
<ListView
android:id="@+id/listView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/button1"
android:layout_centerHorizontal="true" >
</ListView>
</RelativeLayout>
스크린샷
간단히 말하면, 목록 보기를 만들 때 데이터에 대한 참조를 전달합니다.이제 이 데이터가 변경될 때마다 목록 보기에 영향을 미치므로 adapter.notifyDataSetChanged();를 호출한 후 항목을 추가합니다.
RecyclerView를 사용하는 경우 마지막 요소(objs 목록 끝에 추가한 경우)만 업데이트하여 메모리를 저장합니다. mAdapter.notify삽입된 항목(mItems.size() - 1);
This is the simple answer how to add datas dynamically in listview android kotlin
class MainActivity : AppCompatActivity(){
var listItems = arrayListOf<String>()
val array = arrayOf("a","b","c","d","e")
var listView: ListView? = null
private lateinit var adapter: listViewAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.scrollview_layout)
listItems.add("a")
listItems.add("b")
listItems.add("c")
listItems.add("d")
listItems.add("e")
//if you want to add array items to a list you can try this for each loop
for(items in array)
listItems.add(items)
//check the result in console
Log.e("TAG","listItems array: $listItems")
adapter = ListViewAdapter()
adapter.updateList(listItems)
adapter.notifyDataSetChanged()
}
}
//Here is the adapter class
class ListviewAdapter : BaseAdapter(){
private var itemsList = arrayListOf<String>()
override fun getView(position: Int, container: View?, parent: ViewGroup?): View {
var view = container
val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
if (view == null)
view = inflater.inflate(R.layout.list_pc_summary, parent, false)
return view
}
override fun getItem(position: Int): Any = itemsList[position]
override fun getItemId(position: Int): Long = position.toLong()
override fun getCount(): Int = itemsList.size
fun updateList(listItems: ArrayList<String>()){
this.itemsList = listItems
notifyDatSetChanged
}
}
//Here I just explained two ways, we can do this many ways.
언급URL : https://stackoverflow.com/questions/4540754/how-do-you-dynamically-add-elements-to-a-listview-on-android
'programing' 카테고리의 다른 글
Node.js가 하위 프로세스를 생성하고 터미널 출력을 라이브로 가져옵니다. (0) | 2023.07.25 |
---|---|
오라클에서 날짜를 다른 형식으로 표시하는 방법 (0) | 2023.07.25 |
Dunction2에서 SQL의 YEAR(), MONTH() 및 DAY()를 어떻게 사용할 수 있습니까? (0) | 2023.07.25 |
Pandas 데이터 프레임의 문자열에 선행 0 추가 (0) | 2023.07.25 |
패키지에 'type: module'이(가) 있는 이유입니다.json 파일? (0) | 2023.07.25 |