2015-08-27 133 views
1

任何人都可以告诉我在Grid-View项目中动态设置按钮数的方法。我的意思是,假设我有3X3的grid-view(由不同产品的类别组成),当我点击它的第一个项目,我第一次获取网格视图中的子产品按钮列表,并且根据子产品的可用性,每个项目的编号都不相同。GridView中动态添加多个按钮

网格视图项目中显示的按钮列表可能会有所不同的每个项目click.I是新到Android所以任何帮助将不胜感激

这里是我的适配器的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="wrap_content" 
 
    android:gravity="center" 
 
    android:orientation="horizontal" > 
 

 
    <LinearLayout 
 
     android:layout_width="match_parent" 
 
     android:layout_height="wrap_content" 
 
     android:orientation="vertical" > 
 

 
     <LinearLayout 
 
      android:layout_width="match_parent" 
 
      android:layout_height="wrap_content" 
 
      android:gravity="center" 
 
      android:orientation="vertical" > 
 

 
      <com.mss.skyjack.custom.views.SkyjackCustomTextview 
 
       android:id="@+id/tv_product" 
 
       android:layout_width="wrap_content" 
 
       android:layout_height="wrap_content" 
 
       android:drawablePadding="5dp" 
 
       android:gravity="center" 
 
       android:text="@string/product" 
 
       android:textAppearance="?android:attr/textAppearanceMedium" 
 
       android:textColor="@color/black_color" /> 
 

 
      <ImageView 
 
       android:id="@+id/img_product" 
 
       android:layout_width="wrap_content" 
 
       android:layout_height="wrap_content" 
 
       android:layout_marginTop="60dp" 
 
       android:src="@drawable/ic_launcher" /> 
 

 
      
 

 
       <LinearLayout 
 
        android:id="@+id/lnr_test" 
 
        android:layout_width="match_parent" 
 
        android:layout_height="wrap_content" 
 
        android:layout_marginLeft="30dp" 
 
        android:layout_marginRight="30dp" 
 
        android:layout_marginTop="30dp" 
 
        android:orientation="vertical"     android:visibility="gone"> 
 
       </LinearLayout> 
 
      
 
     </LinearLayout> 
 

 
     <View 
 
      android:layout_width="match_parent" 
 
      android:layout_height="1dp" 
 
      android:background="#000000" /> 
 
    </LinearLayout> 
 

 
    <View 
 
     android:id="@+id/view_right_line" 
 
     android:layout_width="3dp" 
 
     android:layout_height="match_parent" 
 
     android:background="#000000" /> 
 

 
</LinearLayout>

这里是我的适配器类: -

public class ProductSelectorAdapter extends BaseAdapter { 
 

 
\t Activity activity; 
 
\t List<SelectorTest> listSelector; 
 
\t private Button btn; 
 
\t List<catagoriesListModal> _categories; 
 

 
\t public ProductSelectorAdapter(Activity activity, 
 
\t \t \t List<SelectorTest> listSelector) { 
 
\t \t this.activity = activity; 
 
\t \t this.listSelector = listSelector; 
 
\t } 
 

 
\t @Override 
 
\t public int getCount() { 
 
\t \t return listSelector.size(); 
 
\t } 
 

 
\t @Override 
 
\t public SelectorTest getItem(int position) { 
 
\t \t return listSelector.get(position); 
 
\t } 
 

 
\t @Override 
 
\t public long getItemId(int position) { 
 
\t \t return position; 
 
\t } 
 

 
\t @Override 
 
\t public View getView(int position, View convertView, ViewGroup parent) { 
 
\t \t final ViewHolder viewHolder; 
 
\t \t _categories = listSelector.get(position).getCategories(); 
 
\t \t if (convertView == null) { 
 
\t \t \t LayoutInflater inflater = (LayoutInflater) activity 
 
\t \t \t \t \t .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
 
\t \t \t convertView = inflater.inflate(R.layout.selector_items, parent, 
 
\t \t \t \t \t false); 
 
\t \t \t viewHolder = new ViewHolder(); 
 
\t \t \t viewHolder.tvProductName = (TextView) convertView 
 
\t \t \t \t \t .findViewById(R.id.tv_product); 
 
\t \t \t viewHolder.imgView = (ImageView) convertView 
 
\t \t \t \t \t .findViewById(R.id.img_product); 
 
\t \t \t viewHolder.viewRightLine = (View) convertView 
 
\t \t \t \t \t .findViewById(R.id.view_right_line); 
 
\t \t \t viewHolder.lnrLayout = (LinearLayout) convertView 
 
\t \t \t \t \t .findViewById(R.id.lnr_test); 
 

 
\t \t \t convertView.setTag(viewHolder); 
 

 
\t \t } else { 
 
\t \t \t viewHolder = (ViewHolder) convertView.getTag(); 
 
\t \t } 
 
\t \t if (!activity.getResources().getBoolean(R.bool.landscape_only)) { 
 
\t \t \t if (position % 2 != 0) { 
 
\t \t \t \t viewHolder.viewRightLine.setVisibility(View.GONE); 
 
\t \t \t } else { 
 
\t \t \t \t viewHolder.viewRightLine.setVisibility(View.VISIBLE); 
 
\t \t \t } 
 
\t \t } else { 
 
\t \t \t if (position % 3 != 0 & position % 3 != 1) { 
 
\t \t \t \t viewHolder.viewRightLine.setVisibility(View.GONE); 
 
\t \t \t } else { 
 
\t \t \t \t viewHolder.viewRightLine.setVisibility(View.VISIBLE); 
 
\t \t \t } 
 
\t \t } 
 

 
\t \t SelectorTest selectorTest = listSelector.get(position); 
 
\t \t viewHolder.tvProductName.setText(selectorTest.getName()); 
 
\t \t viewHolder.imgView.setImageResource(selectorTest.getImage()); 
 
\t \t viewHolder.imgView.setOnClickListener(new OnClickListener() { 
 

 
\t \t \t @Override 
 
\t \t \t public void onClick(View v) { 
 
\t \t \t \t if (activity.getResources().getBoolean(R.bool.landscape_only)) { 
 
\t \t \t \t \t viewHolder.lnrLayout.setVisibility(View.VISIBLE); 
 
\t \t \t \t \t viewHolder.imgView.setVisibility(View.GONE); 
 

 
\t \t \t \t \t for (int i = 0; i < _categories.size(); i++) { 
 

 
\t \t \t \t \t \t btn = new Button(activity); 
 
\t \t \t \t \t \t btn.setText(_categories.get(i).getName()); 
 

 
\t \t \t \t \t \t viewHolder.lnrLayout.addView(btn); 
 
\t \t \t \t \t \t int idx = viewHolder.lnrLayout.indexOfChild(btn); 
 
\t \t \t \t \t \t btn.setTag(Integer.toString(idx)); 
 

 
\t \t \t \t \t \t btn.setOnClickListener(new OnClickListener() { 
 

 
\t \t \t \t \t \t \t @Override 
 
\t \t \t \t \t \t \t public void onClick(View v) { 
 
\t \t \t \t \t \t \t \t String idxStr = (String) v.getTag(); 
 
\t \t \t \t \t \t \t \t Toast.makeText(activity, idxStr, 
 
\t \t \t \t \t \t \t \t \t \t Toast.LENGTH_SHORT).show(); 
 

 
\t \t \t \t \t \t \t } 
 
\t \t \t \t \t \t }); 
 
\t \t \t \t \t } 
 
\t \t \t \t } else { 
 
\t \t \t \t \t Session.ChangeFragmentWithBack(new ProductDetailFragment(), 
 
\t \t \t \t \t \t \t "ProductDetailFragment", "ProductDetailFragment", 0); 
 
\t \t \t \t } 
 

 
\t \t \t } 
 
\t \t }); 
 

 
\t \t return convertView; 
 
\t } 
 

 
\t static class ViewHolder { 
 
\t \t TextView tvProductName, tvTest; 
 
\t \t ImageView imgView; 
 
\t \t View viewRightLine; 
 
\t \t ListView lstroduct; 
 
\t \t ScrollView scrlLstItems; 
 
\t \t LinearLayout lnrLayout; 
 
\t \t Button btn1, btn2, btn3; 
 
\t }

这里是我SelectorTest模型类: -

import java.util.List; 
 

 

 

 
public class SelectorTest { 
 
\t int id; 
 
\t String name; 
 
\t int image; 
 
\t List<catagoriesListModal> categories; 
 

 
\t public int getId() { 
 
\t \t return id; 
 
\t } 
 

 
\t public void setId(int id) { 
 
\t \t this.id = id; 
 
\t } 
 

 
\t public String getName() { 
 
\t \t return name; 
 
\t } 
 

 
\t public void setName(String name) { 
 
\t \t this.name = name; 
 
\t } 
 

 
\t public int getImage() { 
 
\t \t return image; 
 
\t } 
 

 
\t public void setImage(int image) { 
 
\t \t this.image = image; 
 
\t } 
 

 
\t public List<catagoriesListModal> getCategories() { 
 
\t \t return categories; 
 
\t } 
 

 
\t public void setCategories(List<catagoriesListModal> categories) { 
 
\t \t this.categories = categories; 
 
\t } 
 

 
}

这里是我catagoriesListModal类: -

public class catagoriesListModal { 
 
\t String name; 
 
\t int id; 
 

 
\t public String getName() { 
 
\t \t return name; 
 
\t } 
 

 
\t public void setName(String name) { 
 
\t \t this.name = name; 
 
\t } 
 

 
\t public int getId() { 
 
\t \t return id; 
 
\t } 
 

 
\t public void setId(int id) { 
 
\t \t this.id = id; 
 
\t } 
 

 
}

谢谢

+0

必须使用您网格视图正确的适配器使用?你可以发布代码吗? – harshitpthk

+0

嘿哈尔斯,谢谢你的回复,请检查我更新后的帖子 –

+0

运行你粘贴的代码后你得到了什么?任何错误?崩溃?或者是其他东西? –

回答

1

您的方法是正确的,但您的模型本身并没有考虑到类别。 修改你的模型到下面。

import java.util.List; 


public class SelectorTest { 
int id; 
String name; 
int image; 
List<String> categories; 


public int getId() { 
    return id; 
} 

public void setId(int id) { 
    this.id = id; 
} 



public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public int getImage() { 
    return image; 
} 

public void setImage(int image) { 
    this.image = image; 
} 

public List<String> getCategories() { 
    return categories; 
} 

public void setCategories(List<String> categories) { 
    this.categories = categories; 
} 
} 

现在修改您的适配器类相应

public class ProductSelectorAdapter extends BaseAdapter { 

Activity activity; 
List<SelectorTest> listSelector; 
private Button btn; 

public ProductSelectorAdapter(Activity activity, 
           List<SelectorTest> listSelector) { 
    this.activity = activity; 
    this.listSelector = listSelector; 

} 

@Override 
public int getCount() { 
    return listSelector.size(); 
} 

@Override 
public SelectorTest getItem(int position) { 
    return listSelector.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    final ViewHolder viewHolder; 
    if (convertView == null) { 
     LayoutInflater inflater = (LayoutInflater) activity 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = inflater.inflate(R.layout.selector_items, parent, 
       false); 
     viewHolder = new ViewHolder(); 
     viewHolder.tvProductName = (TextView) convertView 
       .findViewById(R.id.tv_product); 
     viewHolder.imgView = (ImageView) convertView 
       .findViewById(R.id.img_product); 
     viewHolder.viewRightLine = (View) convertView 
       .findViewById(R.id.view_right_line); 
     viewHolder.lnrLayout = (LinearLayout) convertView 
       .findViewById(R.id.lnr_test); 

     convertView.setTag(viewHolder); 

    } else { 
     viewHolder = (ViewHolder) convertView.getTag(); 
    } 
    if (!activity.getResources().getBoolean(R.bool.landscape_only)) { 
     if (position % 2 != 0) { 
      viewHolder.viewRightLine.setVisibility(View.GONE); 
     } else { 
      viewHolder.viewRightLine.setVisibility(View.VISIBLE); 
     } 
    } else { 
     if (position % 3 != 0 & position % 3 != 1) { 
      viewHolder.viewRightLine.setVisibility(View.GONE); 
     } else { 
      viewHolder.viewRightLine.setVisibility(View.VISIBLE); 
     } 
    } 

    SelectorTest selectorTest = listSelector.get(position); 
    viewHolder.tvProductName.setText(selectorTest.getName()); 
    viewHolder.imgView.setImageResource(selectorTest.getImage()); 


    convertView.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      if (activity.getResources().getBoolean(R.bool.landscape_only)) { 

       viewHolder.lnrLayout.setVisibility(View.VISIBLE); 
       viewHolder.imgView.setVisibility(View.GONE); 
       List<String> _categories = listSelector.get(position).getCategories(); 
       for (int i = 0; i < _categories.size(); i++) { 

        btn = new Button(activity); 
        btn.setText(_categories.get(i)); 
        viewHolder.lnrLayout.addView(btn); 
        int idx = viewHolder.lnrLayout.indexOfChild(btn); 
        btn.setTag(Integer.toString(idx)); 
       } 
       btn.setOnClickListener(new OnClickListener() { 

        @Override 
        public void onClick(View v) { 
         String idxStr = (String) v.getTag(); 
         Toast.makeText(activity, idxStr, Toast.LENGTH_SHORT).show(); 

        } 
       }); 

      } 
     } 
    }); 

    return convertView; 
} 

static class ViewHolder { 
    TextView tvProductName, tvTest; 
    ImageView imgView; 
    View viewRightLine; 
    ListView lstroduct; 
    ScrollView scrlLstItems; 
    LinearLayout lnrLayout; 

} 
} 

你必须看到,我已经改变了可变位置,最终的决定。(只是为了更快的响应),如果你不想说。 您可以创建一个自定义的View.OnclickListener,它将位置作为参数。像这样

class MyOwnClickListener implements OnClickListener { 
    int position; 

    public MyOwnClickListener(int position) { 
     this.position = position; 
    } 

    @Override 
    public void onClick(View v) { 
.... 

,并为您的convertView然后你可以使用

convertView.setOnClickListener(new MyOwnClickListener(position) { 

如果存在任何疑问都伸手。 感谢

更新

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/scrollView" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:fillViewport="true" > 
    <LinearLayout 
       android:id="@+id/lnr_test" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_marginLeft="30dp" 
       android:layout_marginRight="30dp" 
       android:layout_marginTop="30dp" 
       android:orientation="vertical"      android:visibility="gone"> 
      </LinearLayout> 
    </ScrollView> 
+1

我可能认为你会通过网络获取你的模型列表,因此你将不得不在你的响应数据中包含这些类别 – harshitpthk

+0

嘿hars谢谢你的想法......并且是它的工作,但我仍然遇到同样的问题我动态创建的按钮越来越重叠与我的网格物品,你可以请建议一种方式,让我可以处理这个问题.. –

+0

我更新了我的代码,根据你的想法... –