请问我不知道是什么问题。没有任何错误,程序 工作完美。但是,当我单击 ListView 中的某个项目时,它不会执行任何操作。换句话说,“ toast ”不会通过
这是我的主要类(class):
public class ViewListAct extends ActionBarActivity {
private ListView list;
private final String[] names_1 = {"McDonald's", "Subway", "Pizza Hut", "Burger King"};
private final String[] img_1 = {"mcd", "mcd", "mcd", "mcd"};
private Activity context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.view_list);
list = (ListView) findViewById(R.id.listview);
AdapterView adapter = new AdapterView(this, img_1, names_1);
list.setAdapter(adapter);
list.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {
@Override
public void onItemClick(android.widget.AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(getApplicationContext(), names_1[position], Toast.LENGTH_LONG).show();
}
});
}
这是我的自定义适配器类:
public class AdapterView extends ArrayAdapter<String> {
private Activity context_1;
private String[] names_1;
private String[] img_1;
public AdapterView(Activity context, String[] img, String[] names) {
super(context, R.layout.pic_letf_tv_right, names);
context_1 = context;
this.names_1 = names;
this.img_1 = img;
}
public View getView(int position, View view, ViewGroup parent){
LayoutInflater l_i_f = context_1.getLayoutInflater();
View rv = l_i_f.inflate(R.layout.pic_letf_tv_right, null);
TextView tv_l = (TextView) rv.findViewById(R.id.tv_view);
tv_l.setText(names_1[position]);
ImageView imageView = (ImageView) rv.findViewById(R.id.log_img);
int id = context_1.getResources().getIdentifier(img_1[position], "drawable", context_1.getPackageName());
imageView.setImageResource(id);
return rv;
}
这是我的自定义行 xml 文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent"
android:clickable="true"
android:orientation="horizontal"
>
<ImageView
android:layout_width="500px"
android:layout_height="500px"
android:id="@+id/log_img"
/>
<TextView
android:id="@+id/tv_view"
android:layout_gravity="center"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="500px"
android:textColor="#FFFFFF"
android:textSize="18dp"/>
</LinearLayout>
这是我的 ListView 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:overScrollMode="always"
tools:context=".ViewList">
<ListView
android:id="@+id/listview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scrollingCache="false"
android:smoothScrollbar="true"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:background="#000000" />
谁能告诉我我做错了什么。
最佳答案
首先使用ViewHolder
模式。第二次扩展 BaseAdapter
而不是 AdapterView
。第三步从 row.xml
中删除 android:clickable="true"
。可点击状态必须在方法 onItemClickListener
中有 ListView
,而不是自己的行。
已更新
对于自定义 ListView ,您可以使用 BaseAdapter。
对于 Adapter Class,你有一些技巧可以让它变得流畅,为此你可以引用 this
它还与已创建行的控件实例的可重用性有关。对于 ViewHolder 模式,我更喜欢使用它来保存对象。请查看this更多详情
适配器的 getView 方法的代码中缺少它。
有关更多解释,我在 Adapter 的 getView 方法中发表评论。
如果您要使用 thn 命名约定,则保存详细信息的类应该是正确的 这里首先名称是“对象”,这是错误的。
Activity
private ListView list;
private final ArrayList<RestaurantsDetails> pairs = new ArrayList<RestaurantsDetails>();
private Activity context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
pairs.add(new RestaurantsDetails("McDonald's", "mcd"));
pairs.add(new RestaurantsDetails("Subway", "mcd"));
pairs.add(new RestaurantsDetails("Pizza Hut", "mcd"));
pairs.add(new RestaurantsDetails("Burger King", "mcd"));
list = (ListView) findViewById(R.id.listview);
AdapterViewCustom adapter = new AdapterViewCustom(this, pairs);
list.setAdapter(adapter);
list.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {
@Override
public void onItemClick(android.widget.AdapterView<?> parent,
View view, int position, long id) {
Toast.makeText(getApplicationContext(),
pairs.get(position).name, Toast.LENGTH_LONG).show();
}
});
}
数据层类
/**
* Use proper name For the class. Should not use the name like "Object" or
* the class which is already used by framework
*
*/
public class RestaurantsDetails {
public String name;
public String img;
public RestaurantsDetails(String name, String img) {
this.name = name;
this.img = img;
}
}
适配器
public class AdapterViewCustom extends BaseAdapter {
private Activity context_1;
private ArrayList<RestaurantsDetails> pairs;
public AdapterViewCustom(Activity context,
ArrayList<RestaurantsDetails> pairs) {
context_1 = context;
this.pairs = pairs;
}
@Override
public int getCount() {
return pairs.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
if (convertView == null) {
convertView = LayoutInflater.from(context_1).inflate(
R.layout.custom_row, null);
viewHolder = new ViewHolder();
viewHolder.img = (ImageView) convertView
.findViewById(R.id.log_img);
viewHolder.txt = (TextView) convertView
.findViewById(R.id.tv_view);
/**
* At very first time when the List View row Item control's
* instance is created it will be store in the convertView as a
* ViewHolder Class object for the reusability purpose
**/
convertView.setTag(viewHolder);
} else {
/**
* Once the instance of the row item's control it will use from
* already created controls which are stored in convertView as a
* ViewHolder Instance
* */
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.txt.setText(pairs.get(position).name);
int id = context_1.getResources().getIdentifier(
pairs.get(position).img, "drawable",
context_1.getPackageName());
viewHolder.img.setImageResource(id);
return convertView;
}
public class ViewHolder {
public final ImageView img;
public final TextView txt;
}
}
关于android - Android Studio 中带有自定义适配器的自定义 ListView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28406084/