【问题标题】:How to click on listview item after change it to different to layout?将列表视图项目更改为与布局不同后如何单击?
【发布时间】:2016-03-15 06:46:13
【问题描述】:

当我点击列表视图时,它会将该项目更改为不同的布局。但在那之后我不能再点击那个项目了。我应该做些什么?请帮我。谢谢。

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    ViewHolder holder;

    if (convertView == null || convertView.getTag() == null) {
        convertView = inflater.inflate(R.layout.activity_mainlist_item, parent, false);
        holder = new ViewHolder(convertView);
        convertView.setTag(holder);

    }else {
        holder = (ViewHolder) convertView.getTag();
    }

    holder.rl_item.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            selectedItem(position);
            notifyDataSetChanged();
            Intent intent = new Intent(mContext.getApplicationContext(), DetailActivity.class);
            mContext.startActivity(intent);
        }
    });

    if (this.clk_position == position) {
        View view = inflater.inflate(R.layout.activity_mainlist_item_p, null);
        return view;
    }
    return convertView;
}

【问题讨论】:

  • 你能解释一下你到底想要什么。这样我们就可以理解场景了。
  • 对不起。好吧,首先我有一个列表视图,其中项目使用布局“activity_mainlist_item”进行膨胀,但是在单击它后它会更改为布局“activity_mainlist_item_p”。更改为布局“B”后,我无法再单击该项目。但我可以点击其他项目。
  • 发布您选择的项目(位置);方法,您是否在单击项目后更改了 rl_item 视图。
  • 是的,点击后我将其更改为新布局。这就是为什么我不能在那个项目上调用 onClick 。我该怎么办? public void selectedItem(int position) { this.clk_position = position; //clk_position 是一个全局变量 } @ReazMurshed
  • 您不必更改布局。相反,您可以使用相同的布局并通过设置项目的可见性来实现所需的行为。

标签: android listview layout-inflater


【解决方案1】:

我建议使用单一布局并将其分为两个部分。默认情况下,第一部分是可见的,第二部分是不可见的。当您单击列表项时,使第一部分不可见,第二部分可见。

例如,

list_item_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent">

    <!-- replace below TextView with the layout of activity_mainlist_item.xml -->
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:text="Layout 1"
        android:id="@+id/layout1"
        android:background="@android:color/holo_blue_bright"
        />

    <!-- replace below TextView with the layout activity_mainlist_item_p.xml and don't forget to set android:visibility="gone"  -->
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:text="Layout 2"
        android:id="@+id/layout2"
        android:visibility="gone"
        android:background="@android:color/holo_purple"
        />
</LinearLayout>

getView(),尝试如下

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    ViewHolder holder;

    if (convertView == null || convertView.getTag() == null) {
        convertView = inflater.inflate(R.layout.list_item_layout, parent, false);
        holder = new ViewHolder(convertView);
        // Assuming `ViewHolder` has layout1 and layout2.
        holder.layout1 = (TextView) convertView.findViewById(R.id.layout1);
        holder.layout2 = (TextView) convertView.findViewById(R.id.layout2);
        convertView.setTag(holder);

    }else {
        holder = (ViewHolder) convertView.getTag();
    }

    holder.rl_item.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            selectedItem(position);
            notifyDataSetChanged();
            Intent intent = new Intent(mContext.getApplicationContext(), DetailActivity.class);
            mContext.startActivity(intent);
        }
    });

    if (this.clk_position == position) {
        // Here, set swap the visibility or vice versa depending on your conditions
        holder.layout1.setVisibility(View.GONE);
        holder.layout2.setVisibility(View.VISIBLE);
        return view;
    }
    return convertView;
}

【讨论】:

  • 所以当我们初始化它的值时,我们必须做两次,对吧?
  • holder = new ViewHolder(convertView);' and depending on the condition, set visibility and its values. No need to initialize ViewHolder`下面初始化你的完整布局两次。我也会更新我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多