Android-GridView中的不同项目未显示
我正在开发一个应用程序,它有一个图像的GridView,但GridView中的最后一个项目是一个按钮,可以将更多的项目加载到网格中。但我面临一个奇怪的问题,那个就是当我在GridView上快速上下滚动时,按钮有时会出现,有时不会。我认为这是因为回收问题,但我不知道如何解决它 这是我的密码:-Android-GridView中的不同项目未显示,android,button,gridview,recycle,Android,Button,Gridview,Recycle,我正在开发一个应用程序,它有一个图像的GridView,但GridView中的最后一个项目是一个按钮,可以将更多的项目加载到网格中。但我面临一个奇怪的问题,那个就是当我在GridView上快速上下滚动时,按钮有时会出现,有时不会。我认为这是因为回收问题,但我不知道如何解决它 这是我的密码:- public class ButtonGridAdapter extends BaseAdapter implements OnCheckedChangeListener, OnClickListener
public class ButtonGridAdapter extends BaseAdapter implements OnCheckedChangeListener, OnClickListener {
private ArrayList<String> thumbUrls;
private ArrayList<String> mainUrls;
private LayoutInflater layoutInflater;
private Context context;
private Intent intent;
private ArrayList<String> positions = new ArrayList<String>();
private static ArrayList<String> urlsToUpload = new ArrayList<String>();
private int width;
public ButtonGridAdapter(Context context, ArrayList<String> thumbUrls, ArrayList<String> mainUrls, String clicked)
{
this.context = context;
this.thumbUrls = thumbUrls;
this.mainUrls = mainUrls;
intent = new Intent(context, GalleryView.class);
this.layoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
DisplayMetrics displaymetrics = new DisplayMetrics();
((Activity) context).getWindow().getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
this.width = displaymetrics.widthPixels;
System.out.println(width+" width");
}
@Override
public int getCount() {
return thumbUrls.size()+1;
}
@Override
public Object getItem(int arg0) {
return thumbUrls.get(arg0);
}
@Override
public long getItemId(int position) {
return position;
}
public static class ViewHolder
{
ImageView mainImage;
CheckBox checkBox;
Button button;
}
public static class ButtonHolder
{
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View row = convertView;
ViewHolder holder;
if(row==null || row.getTag().equals("button"))
{
row = layoutInflater.inflate(R.layout.griditem, parent, false);
holder = new ViewHolder();
holder.mainImage = (ImageView)row.findViewById(R.id.itemgrid);
holder.checkBox = (CheckBox)row.findViewById(R.id.itemselected);
holder.button = null;
row.setTag(holder);
}
else
{
holder = (ViewHolder)row.getTag();
}
if(position==thumbUrls.size())
{
int width = row.getWidth();
int height = row.getHeight()-70;
row = layoutInflater.inflate(R.layout.mybutton, parent, false);
holder.button = (Button)row.findViewById(R.id.gridbutton);
holder.button.setText("Load More");
LayoutParams params = holder.button.getLayoutParams();
params.height = height;
params.width = width;
holder.button.requestLayout();
holder.button.setOnClickListener(this);
System.out.println("Called");
row.setTag("button");
return row;
}
else
{
setImageSize(holder.mainImage);
System.out.println(position);
holder.mainImage.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
intent.putExtra("position", position);
intent.putStringArrayListExtra("MainUrls", mainUrls);
intent.putStringArrayListExtra("Thumbnails", thumbUrls);
context.startActivity(intent);
}
});
holder.checkBox.setOnCheckedChangeListener(null);
holder.checkBox.setTag(position);
holder.checkBox.setChecked(positions.contains(thumbUrls.get(position)));
holder.checkBox.setOnCheckedChangeListener(this);
UrlImageViewHelper.setUrlDrawable(holder.mainImage, thumbUrls.get(position), R.drawable.extras_load);
return row;
}
}
private void setImageSize(ImageView imageView) {
LayoutParams params = imageView.getLayoutParams();
int leftWidth = width - 80;
params.width = leftWidth/3;
params.height = leftWidth/3;
imageView.requestLayout();
}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(isChecked)
{
positions.add(thumbUrls.get((Integer)buttonView.getTag()));
urlsToUpload.add(mainUrls.get((Integer)buttonView.getTag()));
}
else
{
positions.remove(thumbUrls.get((Integer)buttonView.getTag()));
urlsToUpload.remove(mainUrls.get((Integer)buttonView.getTag()));
}
}
public static ArrayList<String> getUrlsToUpload()
{
return urlsToUpload;
}
@Override
public void onClick(View v) {
if(v.getId()==R.id.gridbutton)
{
InstagramImpl.getInstance().fetchMorePhotos();
}
}
}
公共类ButtonGridAdapter扩展BaseAdapter实现OnCheckedChangeListener、OnClickListener{
私有ArrayList thumbURL;
私有ArrayList mainURL;
私人停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场;
私人语境;
私人意图;
private ArrayList positions=new ArrayList();
私有静态ArrayList urlsToUpload=新ArrayList();
私有整数宽度;
public ButtonGridAdapter(上下文上下文、ArrayList ThumbURL、ArrayList MainURL、单击的字符串)
{
this.context=上下文;
this.thumbURL=thumbURL;
this.mainURL=mainURL;
意图=新意图(上下文,GalleryView.class);
this.layoutInflater=(layoutInflater)context.getSystemService(context.LAYOUT\u INFLATER\u SERVICE);
DisplayMetrics DisplayMetrics=新的DisplayMetrics();
((活动)上下文).getWindow().getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
this.width=displaymetrics.widthPixels;
系统输出打印项数(宽度+宽度);
}
@凌驾
public int getCount(){
返回thumbURL.size()+1;
}
@凌驾
公共对象getItem(int arg0){
返回thumbURL.get(arg0);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
公共静态类视图持有者
{
ImageView主图像;
复选框;
按钮;
}
公共静态类按钮盒
{
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
视图行=转换视图;
视窗座;
if(row==null | | row.getTag().equals(“按钮”))
{
row=LayoutFlater.inflate(R.layout.griditem,父项,false);
holder=新的ViewHolder();
holder.mainImage=(ImageView)row.findViewById(R.id.itemgrid);
holder.checkBox=(checkBox)row.findViewById(R.id.itemselected);
holder.button=null;
row.setTag(支架);
}
其他的
{
holder=(ViewHolder)row.getTag();
}
if(position==thumbURL.size())
{
int width=row.getWidth();
int height=row.getHeight()-70;
行=布局更平坦。充气(R.layout.mybutton,父项,false);
holder.button=(button)row.findViewById(R.id.gridbutton);
holder.button.setText(“加载更多”);
LayoutParams params=holder.button.getLayoutParams();
参数高度=高度;
参数宽度=宽度;
holder.button.requestLayout();
holder.button.setOnClickListener(此);
System.out.println(“被调用”);
row.setTag(“按钮”);
返回行;
}
其他的
{
setImageSize(holder.mainImage);
系统输出打印项次(位置);
holder.mainImage.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
意图。额外(“位置”,位置);
intent.putStringArrayListExtra(“mainURL”,mainURL);
putStringArrayListExtra(“缩略图”,缩略图URL);
背景。开始触觉(意图);
}
});
holder.checkBox.setOnCheckedChangeListener(null);
holder.checkBox.setTag(位置);
holder.checkBox.setChecked(positions.contains(thumbURL.get(position));
holder.checkBox.setOnCheckedChangeListener(此);
UrlImageViewHelper.setUrlDrawable(holder.mainImage,thumbUrls.get(position),R.drawable.extras_load);
返回行;
}
}
私有void setImageSize(ImageView ImageView){
LayoutParams params=imageView.getLayoutParams();
int leftWidth=宽度-80;
params.width=leftWidth/3;
参数高度=左宽度/3;
requestLayout();
}
@凌驾
检查更改后的公共无效(复合按钮视图,布尔值已检查){
如果(已检查)
{
positions.add(thumbURL.get((整数)buttonView.getTag());
添加(mainURL.get((整数)buttonView.getTag());
}
其他的
{
positions.remove(thumbURL.get((整数)buttonView.getTag());
urlsToUpload.remove(mainURL.get((整数)buttonView.getTag());
}
}
公共静态ArrayList getUrlsToUpload()
{
返回urlsToUpload;
}
@凌驾
公共void onClick(视图v){
if(v.getId()==R.id.gridbutton)
{
InstagramImpl.getInstance().fetchMorePhotos();
}
}
}
任何帮助都将非常感谢
谢谢。也许您可以尝试
删除行==null
和holder=(ViewHolder)行。getTag()代码>这是因为回收问题,你可以先试试。但这会影响效率。我想说的另一件事是,如何position==thumbURL.size()代码>?可能是position==thumbURL.size()-1代码>。好的,这是我的观点,我帮助它工作。我发布了另一个答案的完整getView
方法。你先检查一下位置。如果是最后一项(加载更多按钮),请立即返回布局
private final Media special = new Media("-1", "", "", "", "");
public MediaGridAdapter(Context context, int imageID, ArrayList<Media> array, int type, boolean isGetMore) {
list = array;
mediaType = type;
this.context = context;
if(list != null) {
list.add(special);
}
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
RelativeLayout item;
ViewHolder holder;
//this part check it's the last item. -1 is my special item id in contructor.
if(list.get(position).getId().equals("-1")) {
item = (RelativeLayout) LayoutInflater.from(context).inflate(R.layout.item_special_more, null);
item.setTag(MORE_BUTTON);
return item;
}
//
if(convertView == null || convertView.getTag().toString().equals(MORE_BUTTON)) {
Context context = parent.getContext();
item = (RelativeLayout) LayoutInflater.from(context).inflate(R.layout.item_with_icon_vertical, null);
holder = new ViewHolder();
holder.thumbnail = (ImageView) item.findViewById(R.id.iv_icon_media);
item.setTag(holder);
} else {
item = (RelativeLayout) convertView;
holder = (ViewHolder) item.getTag();
}
}
// set data.
holder.thumbnail.setBitmap(...)
return item;
private final Media special=新媒体(“-1”、“新媒体”、“新媒体”、“新媒体”);
公共MediaGridAdapter(上下文上下文、int-imageID、ArrayList数组、int类型、布尔值isGetMore)