【发布时间】:2014-12-12 18:18:38
【问题描述】:
gridview 项目有时会在我单击项目时随机更改顺序,主要是在滚动时。我在整个互联网上进行了搜索,但找不到适用于 recyclerview 的解决方案。
这是我的布局适配器类
public class LayoutAdapter extends RecyclerView.Adapter<LayoutAdapter.SimpleViewHolder>{
private static final int COUNT = 100;
private static final String TAG = "LayoutAdapter";
private final Context mContext;
private final TwoWayView mRecyclerView;
private final int mLayoutId;
private int mCurrentItemId = 0;
private FileManager file_manager;
private ArrayList<Integer> positions;
private static LayoutInflater inflator = null;
private TextView folder_name;
private Context c;
ArrayList<String> mDataSource, mMultiSelectData;
private File file, files;
private File[] list2;
public boolean multi_select_flag = false;
public class SimpleViewHolder extends RecyclerView.ViewHolder {
public SimpleViewHolder(View view) {
super(view);
thumbnail = (ImageView) view.findViewById(R.id.ivFolderThumbnail);
folder_name = (TextView) view.findViewById(R.id.tvFolderTitle);
}
}
//In logcat I see this constructor is being called again and again and again!
public LayoutAdapter(Context context, TwoWayView recyclerView, int layoutId, FileManager filemanager, String file_path) {
mContext = context;
file_manager = filemanager;
c = context;
mDataSource = new ArrayList<String>(file_manager.setHomeDir
(Environment.getExternalStorageDirectory().getPath()));
mRecyclerView = recyclerView;
mLayoutId = layoutId;
String root_sd = Environment.getExternalStorageDirectory().toString();
if (file_path == null) {
file = new File(root_sd);
} else {
file = new File(root_sd + "/" + file_path);
}
Log.d(TAG, "GOT ALL FILES >>>>>>" + root_sd);
list2 = file.listFiles();
}
public String getName(int position) {
String name = list2[position].getName();
return name;
}
public Object getItem(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public SimpleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
final View view = LayoutInflater.from(mContext).inflate(R.layout.grid_item, parent, false);
return new SimpleViewHolder(view);
}
public String getData(int position) {
if (position > mDataSource.size() - 1 || position < 0)
return null;
return mDataSource.get(position);
}
@Override
public void onBindViewHolder(SimpleViewHolder holder, int position) {
// boolean isVertical = (mRecyclerView.getOrientation() ==TwoWayLayoutManager.Orientation.VERTICAL);
final View itemView = holder.itemView;
int num_items = 0;
String temp = file_manager.getCurrentDir();
File file = new File(temp + "/" + mDataSource.get(position));
String[] list = file.list();
if (list != null)
num_items = list.length;
Log.d(TAG, ">>>>>>>>>>>>> " + String.valueOf(file.length()));
folder_name.setText(file.getName());
}
}
@Override
public int getItemCount() {
return mDataSource.size();
}
}
这是布局文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="105dp"
android:layout_height="105dp"
android:orientation="vertical" >
<com.filemanager.android.SquareImageView
android:id="@+id/ivFolderThumbnail"
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_marginLeft="15dp"
android:scaleType="centerCrop"
android:src="@drawable/ic_launcher" />
<TextView
android:id="@+id/tvFolderTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/ivFolderThumbnail"
android:text="Medium Text"
android:textColor="@android:color/black"
android:textAppearance="?android:attr/textAppearanceMedium" />
<ImageView
android:id="@+id/ivMultiSelect"
android:layout_width="50dp "
android:layout_height="50dp"
android:layout_above="@+id/tvFolderTitle"
android:layout_toRightOf="@+id/ivFolderThumbnail"
android:src="@drawable/ic_action_new" />
</RelativeLayout>
【问题讨论】:
-
folder_name 和 thumbnail 应该是自定义 ViewHolder 的字段
-
对不起@pskink 我听不懂你想说什么。你能澄清一点吗?这些字段应该在 onBindViewHolder 或 SimpleViewHolder 中?
-
它们应该在 SimpleViewHolder 中声明
-
你正在使用 TwoWayView,所以我建议在 GitHub 上创建一个问题。 github.com/lucasr/twoway-view 类似的情况发生在框架的 StaggeredGridLayoutManager 上,这是由于 ImageViews 在加载图像时调整大小。您需要避免它,因为项目调整大小会使位置计算无效。如果是简单的网格,请尝试使用框架的 GridLayoutManager 实现。
-
如果您的问题还没有解决,,,请查看stackoverflow.com/a/29137921/1881611
标签: android gridview android-5.0-lollipop android-recyclerview