2016-09-01 64 views
0

我创建了一个包含gridview的新布局。当应用程序运行时,gridview正在获得预期的内容。如何刷新其他项目时点击一个特定项目的gridview android

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

现在我想刷新正常模板的未点击的项目,当我点击一个项目。只有被点击的项目需要包含新模板。但是,当我点击一个项目,即使我点击了其他项目,它仍然与新模板。

图像链接说明事先我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(); 
     } 
    }); 

感谢我的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; 
} 

}

及相关部分。

回答

0

问题是您使用mTag。你使用这个,只有当你的转换视图不是空的时候才能确定使用哪个模板,但是你只在你膨胀一个新的转换视图时才设置它。

mTag不应该是一个实例字段。它应该是您(通常)在您的getView()方法中设置的本地。所以,像这样,

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

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

+0

谢谢@Jeffrey Blattman。您的评论帮助我解决了我的问题。 –

+0

那些谁需要我的代码的最终版本可以看看[链接](http://stackoverflow.com/questions/39238402/how-to-load-a-new-template-on-a-selected-grid-视图项功能于机器人) –

相关问题