如何在android中选定的网格视图项上加载新模板

我是android的新手。 我想加载一个新模板,其中包含网格视图对象的选定项目上的两个按钮。 那可能吗。

我在我的项目中添加了一个gridview,并使用基本适配器将模板加载到gridview的每个项目中。 但我想要的是,当我点击gridview项目时,我想要为所选项目加载一个新模板(布局)。

问题已解决 ,以下是编辑的代码

基础适配器

public class KategoriAdapter extends BaseAdapter{ private Context mContext; private String[] categoryValues; private Bitmap[] pictures; //indicate that positon for new template private int mNewTemplatePos = -1; public KategoriAdapter(Context context, String[] categoryValues, Bitmap[] pictures) { this.mContext = context; this.categoryValues = categoryValues; this.pictures = pictures; } //apply new template to positon public void useNewTemplate(int pos) { mNewTemplatePos =pos; //notiy list that data has changed and the list will refresh ui itself. notifyDataSetChanged(); } @Override public int getCount() { return categoryValues.length; } @Override public Object getItem(int possition) { return null; } @Override public long getItemId(int possition) { return 0; } @Override public View getView(int possition, View convertView, ViewGroup parent) { final LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); int posId = mNewTemplatePos; if (convertView == null){ if (mNewTemplatePos ==possition){ convertView = getNewTemplate(inflater,possition); }else { convertView = getNormalTemplate(inflater,possition); } }else { if (posId==possition){ convertView = getNewTemplate(inflater,possition); }else{ convertView = getNormalTemplate(inflater,possition); } } return convertView; } private View getNormalTemplate(LayoutInflater inflater, int possition) { final View grid = inflater.inflate(R.layout.kategoriler_list_item, null); TextView cName = (TextView) grid.findViewById(R.id.grid_item_ad); ImageView categoryPictures = (ImageView) grid.findViewById(R.id.grid_item_resim); cName.setText(categoryValues[possition]); categoryPictures.setImageBitmap(pictures[possition]); return grid; } private View getNewTemplate(LayoutInflater inflater, int possition) { final View grid = inflater.inflate(R.layout.kategori_secenek_template, null); TextView cName = (TextView) grid.findViewById(R.id.grid_item_ad); cName.setText(categoryValues[possition]); Button btn_nesne_tani = (Button) grid.findViewById(R.id.btn_nesneleri_taniyalim); Button btn_cumle_kur = (Button) grid.findViewById(R.id.btn_cumle_kuralim); btn_nesne_tani.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(mContext,"nesne",Toast.LENGTH_SHORT).show(); } }); btn_cumle_kur.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(mContext,"cümle",Toast.LENGTH_SHORT).show(); } }); return grid; } 

}

KategoriActivity.java

 ..... final KategoriAdapter adapter = new KategoriAdapter(getApplicationContext(), mKategoriler, kategoriResimleri); grid=(GridView)findViewById(R.id.gv_kategoriler); grid.setAdapter(adapter); grid.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { adapter.useNewTemplate(position); Toast.makeText(getApplicationContext(), mKategoriler[position].toString(),Toast.LENGTH_SHORT).show(); } }); } 

我重写了你的KategoriAdapter类:

 public class KategoriAdapter extends BaseAdapter { private Context mContext; private final String[] categoryValues; private final Bitmap[] pictures; //indicate that positon in list are all use new template private List mNewTemplatePos; public ImageView categoryPictures; //indicate that this is normal template view private final String NORMAL_TEMPLATE = "NORMAL_TEMPLATE"; //indicate that this is new template view private final String NEW_TEMPLATE = "NEW_TEMPLATE"; public KategoriAdapter(Context context, String[] categoryValues, Bitmap[] pictures) { this.mContext = context; this.categoryValues = categoryValues; this.pictures = pictures; this.mNewTemplatePos = new ArrayList<>(); } //apply new template to positon public void useNewTemplate(int pos) { mNewTemplatePos.add(pos); //notiy list that data has changed and the list will refresh ui itself. notifyDataSetChanged(); } @Override public int getCount() { return categoryValues.length; } @Override public Object getItem(int possition) { return null; } @Override public long getItemId(int possition) { return 0; } @Override public View getView(int possition, View convertView, ViewGroup parent) { final LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); if (convertView == null) { if (mNewTemplatePos.contains(possition)) { convertView = getNewTemplate(inflater, possition); //use tag to indicate the type of the template convertView.setTag(NEW_TEMPLATE); } else { convertView = getNormalTemplate(inflater, possition); convertView.setTag(NORMAL_TEMPLATE); } } else { switch ((String) convertView.getTag()) { case NORMAL_TEMPLATE: //convertView is the normal template view but you need a new template view in possition if (mNewTemplatePos.contains(possition)) convertView = getNewTemplate(inflater, possition); break; case NEW_TEMPLATE: //convertView is the new template view but you need a normal template view in possition if (!mNewTemplatePos.contains(possition)) convertView = getNormalTemplate(inflater, possition); break; } } return convertView; } private View getNormalTemplate(LayoutInflater inflater, int possition) { View grid = inflater.inflate(R.layout.kategoriler_list_item, null); TextView cName = (TextView) grid.findViewById(R.id.grid_item_ad); categoryPictures = (ImageView) grid.findViewById(R.id.grid_item_resim); cName.setText(categoryValues[possition]); categoryPictures.setImageBitmap(pictures[possition]); return grid; } private View getNewTemplate(LayoutInflater inflater, int possition) { // TODO: 31/08/16 inflate you new template view layout here return youNewTemplateView; } } 

如果当前contentView是getView()中的正确模板类型,则应该确定是否是正确的,因为当contentView不为null时,contentView可能是列表中的新模板之一。使用tag来指示模板类型很方便。

何时使用useNewTemplate(position)?
只需将使用新模板所需的位置应用于useNewTemplate()并在onItemClick()方法中使用它。

 grid.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { useNewTemplate(position); } });