【问题标题】:Android listview setOnItemClickListener and textview setOnLongClickListener together?Android listview setOnItemClickListener 和 textview setOnLongClickListener 在一起?
【发布时间】: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


【解决方案1】:

此代码可能会对您有所帮助

            tv1.setOnLongClickListener(new View.OnLongClickListener() { 

                    @Override 
                    public boolean onLongClick(View v) {
                      // Put a Toast here and try 
                      //  Test long click works 
                    } 
                }); 

【讨论】:

  • 我很困惑。我在这里想念什么。我不想要 textview 的 onclick。 textview 应该只有 onlongclick 监听器。如果确实单击了文本视图,那么我想激活列表视图 onitemclick,就像单击该行中的其他文本视图一样。谢谢
【解决方案2】:

首先让Listview.Setclickable(true); 让您的列表视图可点击 -(指的是 textview 抱歉)并对 textview 执行相同操作.. 并将 textview 的 focusable && focusbaleInTouchMode 添加为 true 也为列表视图执行此操作.. Listview. setDescendantFocusability (View.FOCUS_AFTER_DESCENDANTS);

并将您的 textview onlongitemclicklistener onlongclicklistener 放在您的适配器中而不是.. 注意我只是打字,我没有重新检查愚蠢的错误,所以这样做..我已经迟到了..谢谢 如果有帮助,请告诉我

感谢指正

复制粘贴

public class ListViewAdapter extends ArrayAdapter<Object> {

List<Object> AndroidPlist; 
int AndroidPres;
Context AndroidPcontext;

public ListViewAdapter(Context context, int resource, List<Object> objects) {
    super(context, resource, objects);
    // TODO Auto-generated constructor stub
    this.AndroidPcontext = context;
    this.AndroidPlist = objects;
    this.AndroidPres = resource;
}

@Override
public int getCount() {
    // TODO Auto-generated method stub
    if(AndroidPlist == null){
        return 0;
    }else{
        return AndroidPlist.size();
    }
}

@Override
public Object getItem(int position) {
    // TODO Auto-generated method stub
    return AndroidPlist.get(position);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    View child = convertView;
    final RecordHolder holder;
    if (child == null) { // checking for null
        LayoutInflater inflater = ((Activity) AndroidPcontext).getLayoutInflater(); // inflating the view
        child = inflater.inflate(AndroidPres, parent, false);
        holder = new RecordHolder();
        holder.name = (TextView) child.findViewById(R.id.tv);   // referencing your textview        
        child.setTag(holder);
    } else {
        holder = (RecordHolder) child.getTag(); //
    }
    holder.name.setText("set your text") // 
    holder.name.setOnLongClickListener(new OnLongClickListener() {

        @Override
        public boolean onLongClick(View arg0) {
            // Hurray AndroidP, Elltz has solved your problem.. lol.


            return false;
        }
    });

    return child;
}

static class RecordHolder {
    TextView name;
}
}

setonclick 为您的列表视图,现在应该可以工作了..如果它没有 - (我怀疑).. 只需将您在 listview onclick 中的相同方法放入 textview onlclick ..lol .. 你没有得到问题?你呢?

【讨论】:

  • 试过了,同样的问题:tv.setClickable(true); tv.setFocusable(true); tv.setFocusableInTouchMode(true);并在列表视图 Oncreate: this.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);顺便说一句,textview 没有 onlongitemclicklistener,我想你的意思是 onlongclicklistener?那已经在适配器中了。
  • 我猜这是它的名字,但是..尝试在你的 textview onlongclick 中放置一个Log.v("Onclic""recevd"); .. 看看它是否被调用..@AndroidP
  • 长按文本视图不是问题。尽管单击 textview 不会触发 listview 的 onitemclick。这就是我遇到困难的地方。
  • 你用过View.FOCUS_AFTER_DESCENDANTS ??如果是这样,请删除它..我认为您的问题是 textview 现在您说的是 listview?好吧,它很酷,只需删除它..@AndroidP
  • 嗯,实际上两者都是。我想长按文本视图以弹出一个对话框,并单击列表视图以转到另一个活动。 Onitemclick 也应该在我单击 textview 时触发,但如果我在 textview 上放置 onlongclicklistener 则不会触发。
【解决方案3】:

当您在 xmlView 中定义以下行时,您无法处理 setOnClicklistener:

 android:singleLine="true"

改变它:

android:lines="1"

这很奇怪,但它正在工作

【讨论】:

    猜你喜欢
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    • 1970-01-01
    相关资源
    最近更新 更多