【问题标题】:Gridview with listview inside androidGridview和android里面的listview
【发布时间】:2013-01-22 17:25:44
【问题描述】:

我的应用程序中有一个视图,我必须在其中显示多个列表视图,每个列表视图都包含不同用户的数据。所以到目前为止我所做的是我有一个带有列的gridview,并且在每一列中我用一个listview 填充gridview 单元格。这很好用,但是,它两次显示相同的列表视图,而不是为每列显示不同的列表视图。奇怪的是,如果我用普通标签替换列表视图,它会显示来自不同用户的数据。

我设置gridview适配器的主要活动:

gridview.setNumColumns(10);
                gridview.setHorizontalSpacing(205);
                gridview.setStretchMode(0);
                gridview.setAdapter(new Adapter_Labels_GridView_Calendar_dayview(mContext, Session_CurrentSession.current_CALENDAR));

这是 gridview 的适配器...只是 getview 部分。 (你会看到我为列表视图设置适配器的地方显示相同的列表视图而不是不同的列表视图)

 public View getView(int position,View convertView, ViewGroup parent)
 {

  ListView list;

  if (convertView == null)
  {  
       // if it's not recycled, initialize some attributes  
       list = new ListView(mContext);
       list.setLayoutParams(new GridView.LayoutParams(150, 500));
       list.setPadding(2,2,2,2);
   }  
  else
  {  
       list = (ListView) convertView;  
  }  


  list.setAdapter(new Adapter_ListView_GridView_Calendar(mContext, dagtyeVanhaarkappers.get(position), gebookdeurUser.get(position), tekening.get(position)));
  list.setCacheColorHint(0);

  list.setId(position);

  list.setOnTouchListener(new View.OnTouchListener()
        {

            public boolean onTouch(View v, MotionEvent event)
            {   
                // Disallow the touch request for parent scroll on touch of child view
                v.getParent().requestDisallowInterceptTouchEvent(true);
                return false;
            }
        });

  return list;
 }  

}

提前致谢

编辑:

这是主活动中触摸事件的gridview:

  gridview.setOnTouchListener(new View.OnTouchListener()
     {

            public boolean onTouch(View v, MotionEvent event)
            {
               if(isDayView && created)
               {
                   int numchilds = gridview.getChildCount();
                   for(int i = 0; i < numchilds; i++)
                   {
                       gridview.getChildAt(i).getParent().requestDisallowInterceptTouchEvent(false);

                   }
               }
                return false;
            }
        });

编辑:Adapter_ListView_GridView_Calendar 的获取视图

        public View getView(int position, View convertView, ViewGroup parent)
    {

            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View rowView = inflater.inflate(R.layout.row_bookingslist, parent , false);

            ImageView booking_image = (ImageView) rowView.findViewById(R.id.booking_image);
    TextView textBookingTime = (TextView) rowView.findViewById(R.id.booking_time);
    TextView textBookingUser = (TextView) rowView.findViewById(R.id.booking_byuser);

            booking_image.setImageDrawable(drawables.get(position));
            textBookingTime.setText(daytimes.get(position));
            textBookingUser.setText(bookedbyuser.get(position));


    return rowView;
}

最后回答:

我找到了问题...我认为问题出在适配器上,因为我的视图很奇怪(gridview 中的 Listview)...但是,当将数据读入 arraylist 时,我没有创建新的数据实例使用 for 循环,因此字符串在内存中具有相同的引用。因此,在修改任何一个时,我实际上是在修改该对象的同一个实例。该死的,不敢相信我没有看到这么简单的小东西。谢谢大家的帮助。

【问题讨论】:

  • 发表您的 Adapter_ListView_GridView_Calendar getView() 类的评论。您说列表重复,这意味着列表视图中的适配器正在某处设置相同的数据。您应该正确检查!
  • 你想要整个班级吗?
  • 我要Adapter_ListView_GridView_Calendar的getView()的代码,能否提供?
  • 没问题,我会在原帖中编辑。
  • 好吧,这没有任何帮助。你能尝试一件事吗?在 Adapter_ListView_GridView_Calendar 的 Contructor 中放置一个调试点并检查是否在那里获得相同的数据?

标签: android


【解决方案1】:
final View rowView = inflater.inflate(R.layout.list_mobile, parent, false);
    ListView listView = (ListView) rowView.findViewById(R.id.raw_mylist);

    listView.setAdapter(adapter);

            // PARENT
    mListView.setOnTouchListener(new View.OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
            Log.v("PARENT", "PARENT TOUCH");
            rowView.findViewById(R.id.raw_mylist).getParent()
                    .requestDisallowInterceptTouchEvent(false);
            return false;
        }
    });

            //your grid view as child
    listView.setOnTouchListener(new View.OnTouchListener() {

        public boolean onTouch(View v, MotionEvent event) {
            Log.v("CHILD", "CHILD TOUCH");
            // Disallow the touch request for parent scroll on touch of
            // child view
            v.getParent().requestDisallowInterceptTouchEvent(true);
            return false;
        }
    });

在主适配器的 getview 方法中。

【讨论】:

  • 我在 xml 布局中没有 listviewm,我在代码中动态创建它们。我已经按照你上面的建议做了。
  • 但是你没有在你的getview方法中写gridview touch。
  • 我在主活动中做的,我将在主帖中编辑显示。
  • 完全一样。请注意,触摸和滚动工作正常,问题是它显示两次相同的结果。
猜你喜欢
  • 2020-11-09
  • 1970-01-01
  • 1970-01-01
  • 2017-05-05
  • 1970-01-01
  • 2015-07-28
  • 1970-01-01
  • 2015-01-19
  • 1970-01-01
相关资源
最近更新 更多