gpt4 book ai didi

java - 在Android上显示ListView

转载 作者:行者123 更新时间:2023-12-01 21:16:29 25 4
gpt4 key购买 nike

如何在 Android 中创建可用的 ListView?

并不是找你来修复我的代码,而是在寻找 Android 中 ListView 的简单工作示例,以便我能够理解创建 ListView 并使用它的过程。但我已经包含了我的代码,以便您可以看到我来自哪里以及我一直在尝试什么。

我已执行以下操作但没有成功:

--

制作了一个 xml 布局,其中仅包含一个 TextView 项目:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/dir_text_view"
/>

按照以下教程中的说明创建了以下类: http://www.vogella.com/tutorials/AndroidListView/article.html

public class DataTempleArrayAdapter extends ArrayAdapter<String> {

HashMap<String, Integer> mIdMap = new HashMap<String, Integer>();

public DataTempleArrayAdapter(Context context, int textViewResourceId,
List<String> objects) {
super(context, textViewResourceId, objects);
for (int i = 0; i < objects.size(); ++i) {
mIdMap.put(objects.get(i), i);
}
}

@Override
public long getItemId(int position) {
String item = getItem(position);
return mIdMap.get(item);
}

@Override
public boolean hasStableIds() {
return true;
}

}

在主要 Activity 中,我有一段代码,我尝试将字符串列表添加到与此处的 DataTempleArrayAdapter 关联的 ArrayList:

int i;
for (i=0;i<dirContents.length;i++) {
dirList.add(dirContents[i]);
//Toast.makeText(this, dirList.get(i), Toast.LENGTH_SHORT).show();
}
adapter.notifyDataSetChanged();

dirList 已成功填充,而适配器根本不更新 ListView。

--

在您提出要求之前,我在这里包含了其余的相关代码:

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
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="org.hacktivity.datatemple.MainActivity">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">

<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inputType="text"
android:hint="@string/directory"
android:ems="10"
android:layout_alignParentTop="true"
android:layout_alignParentStart="true"
android:id="@+id/dirEditText" />

<Button
android:text="→"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentStart="true"
android:id="@+id/dirButton"
android:onClick="populateDirList" />

</LinearLayout>

<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:id="@+id/dirListView" />

</LinearLayout>


</RelativeLayout>

唉,MainActivity 类:

public class MainActivity extends AppCompatActivity {

ListView dirListView;
EditText et;
DataTempleArrayAdapter adapter;
ArrayList<String> dirList;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

dirListView = (ListView) findViewById(R.id.dirListView);
et = (EditText) findViewById(R.id.dirEditText);

dirList = new ArrayList<String>();


dirListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {

Toast.makeText(getApplicationContext(),
"Click ListItem Number " + position, Toast.LENGTH_LONG)
.show();

populateDirList(view);
}

});


ArrayList<String> dirList = new ArrayList<String>();
adapter = new DataTempleArrayAdapter(this,
R.id.dir_text_view, dirList);

dirListView.setAdapter(adapter);

}

public void populateDirList (View view) {

File f;

// NO INPUT.
if (et.getText().toString().equals("")) {
Toast.makeText(this, "empty string", Toast.LENGTH_SHORT).show();
return;
}

f = new File(et.getText().toString());
if (f == null) { return; }

String dirContents[] = f.list();
if (dirContents == null) { return; }
dirList = new ArrayList<String>(Arrays.asList(f.list()));

adapter.clear();

int i;
for (i=0;i<dirContents.length;i++) {
dirList.add(dirContents[i]);
//Toast.makeText(this, dirList.get(i), Toast.LENGTH_SHORT).show();
}
adapter.notifyDataSetChanged();

}
}

最佳答案

  • 理解 ListView 的最佳资源之一确实是您在 Vogella 中提到的一个

  • 另一个很酷的资源,可以帮助您了解如何notifyDataSetChanged() 方法适用于 ListView this post from StackOverflow

  • 关于如何使用 CustomLayouts 的简短说明ListView(没有 ViewHolder 模式)检查另一个最好的可用引用:Mkyong

  • 讨论 ListView 中 ViewHolder 模式的好处:检查this StackOverflow post

  • ViewHolder 模式的简明示例和解释 ListView :检查this example from JavaCodeGeeks

为了修复您的代码,我认为之前给出的答案只是问题的一部分:

您确实必须注释该行

 //ArrayList<String> dirList = new ArrayList<String>();

因为,就像 @F43nd1r 提到的那样,这也将是传递到适配器的列表的不同实例

但是当你这样做时,还有更多:

dirList = new ArrayList<String>(Arrays.asList(f.list()));

您正在实例化一个新的、不同的列表,适配器所持有的旧引用不会被更改...它仍将保留旧的对象列表

你也许应该将其替换为:

    dirList.clear();
dirList.addAll(Arrays.asList(f.list()));

希望这有帮助!

关于java - 在Android上显示ListView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39957111/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com