【发布时间】:2014-11-09 17:32:18
【问题描述】:
重写了整个问题。这是我正在尝试做的一个简化示例。我有一个带有自定义适配器的列表视图。适配器生成的每一行都有多个文本视图。在其中两个文本视图上,长按会生成一个对话框。而在另一种观点中,什么也没做。在所有 3 个视图上,如果我单击它们。列表视图的 onitemclick 应该被触发。我希望这个简化的例子能帮助人们更好地理解我想要实现的目标,并且可以提出解决方案。
代码的问题(如果你自己尝试的话)是 onitemclick 没有为实现了 onlongclicklistener 的两个文本视图触发。任何人都知道如何让 onitemclick 为这两个文本视图触发?谢谢。
我有一个带有自定义数组适配器的列表视图:
public class TestListView extends ListView{
final Context mContext;
List<String> list = new ArrayList<String>();
public TestListView(Context context, AttributeSet attrs) {
super(context, attrs);
this.mContext = context;
list.add("Blue");
list.add("Green");
list.add("Red");
list.add("Black");
MyArrayAdapter adapter = new MyArrayAdapter(context, 0, list);
this.setAdapter(adapter);
this.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,int position, long id) {
Log.i("ApplicationName", "onItemClick " + position);
Intent intent = new Intent(mContext, MainActivity.class);
mContext.startActivity(intent);
}
});
}
private class MyArrayAdapter extends ArrayAdapter<String> {
Context context;
HashMap<String, Integer> mIdMap = new HashMap<String, Integer>();
public MyArrayAdapter(Context context, int textViewResourceId,
List<String> objects) {
super(context, textViewResourceId, objects);
this.context = context;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(R.layout.test_view_row, parent, false);
TextView tv1 = (TextView) rowView.findViewById(R.id.tv1);
TextView tv2 = (TextView) rowView.findViewById(R.id.tv2);
TextView tv3 = (TextView) rowView.findViewById(R.id.tv3);
tv1.setText(this.getItem(position));
tv2.setText("tv2 text");
tv3.setText("tv3 text");
tv1.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
new AlertDialog.Builder(context)
.setMessage("You have onLongClicked a textview with color")
.setPositiveButton(
"OK",
new DialogInterface.OnClickListener() {
public void onClick(
DialogInterface dialog,
int which) {
dialog.cancel();
}
}).show();
return false;
}
});
tv3.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
new AlertDialog.Builder(context)
.setMessage("You have onLongClicked a generic textview")
.setPositiveButton(
"OK",
new DialogInterface.OnClickListener() {
public void onClick(
DialogInterface dialog,
int which) {
dialog.cancel();
}
}).show();
return false;
}
});
return rowView;
}
}
}
带有充气的xmlView
<?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="48dp"
android:orientation="horizontal" >
<TextView
android:id="@+id/tv1"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:singleLine="true"
android:gravity="center_vertical" />
<TextView
android:id="@+id/tv2"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:singleLine="true"
android:gravity="center_vertical" />
<TextView
android:id="@+id/tv3"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:singleLine="true"
android:gravity="center_vertical" />
</LinearLayout>
【问题讨论】:
-
对话框不需要长按监听器
-
我知道我不知道。但这就是我想在列表视图中拥有的功能。当用户长按文本视图时,会弹出一个对话框。如果用户单击文本视图,则应该像行中的任何其他视图一样触发 onitemclick。
-
发布您的代码如何设置您的列表适配器
-
行中的其他视图是什么?
-
基本上是其他文本视图。但我只想要那个特定文本视图的 longclick 监听器。
标签: java android android-layout listview android-listview