【问题标题】:How to refresh other items when clicked a specific item of gridview in android单击android中gridview的特定项目时如何刷新其他项目
【发布时间】:2016-09-03 02:06:14
【问题描述】:

我创建了一个包含网格视图的新布局。当应用程序运行时,gridview 正在获取预期的内容。

gridview 的每个单元格都有一个普通的特定模板。当单击一个单元格时,一个新模板会加载到该单元格中。 With the help of @wanglugao, every thing is working fine so far

现在我想在单击项目时通过普通模板刷新未单击的项目。只有单击的项目需要包含新模板。但是,当我单击一个项目时,即使我单击了另一个项目,它也会保留在新模板中。

图片链接说明了我的current status

这是我的 BaseAdapter,

public class KategoriAdapter extends BaseAdapter{

private Context mContext;
private String[] categoryValues;
private Bitmap[] pictures;
private String mTag = "NORMAL_TEMPLATE";


//indicate that position using new template
private int mNewTemplatePos = -1;

//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;
}

//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);

    if (convertView == null) {

        if (mNewTemplatePos==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);
            mTag = (String) convertView.getTag();
        }


    } else {
        switch (mTag) {
            case NORMAL_TEMPLATE:
                //convertView is the normal template view but you need a new template view in possition
                if (mNewTemplatePos==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!=possition)
                    convertView = getNormalTemplate(inflater, possition);
                break;
            default:
                break;
        }
    }
    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;
}

}

以及我的 Activity.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();
        }
    });

提前致谢。

【问题讨论】:

    标签: java android gridview


    【解决方案1】:

    问题在于您使用了mTag。当您的转换视图不为空时,您可以使用此且仅此来确定要使用的模板,但您仅在为新的转换视图充气时才设置它。

    mTag 不应是实例字段。它应该是您(总是)在 getView() 方法中设置的本地。就这样,

    Tag tag = mNewTemplatePos==possition ? NEW : NORMAL;
    switch (tag) {
      // inflate base on the tag
    }
    

    另外,您没有正确使用转换视图;在某些情况下你把它扔掉。如果您的网格中有两个非常不同的单元格,您应该使用视图类型(Google 搜索)或使用一种布局并通过隐藏或显示部分来改变它。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-04
    • 2011-02-19
    • 2014-06-28
    相关资源
    最近更新 更多