自定义适配器不清除()(我应该@Override吗?)
Custom adapter does not clear() (should I @Override?)
我是 Android 开发人员的新手,我不是那种在没有先进行深入研究的情况下提出问题(这实际上是我的第一次)的人,但我被困住了...
我创建了一个自定义适配器来填充 gridview,并且使用假数据一切正常。但是当涉及到清除数据时,就出现了问题。我的日志说这是由 "java.lang.UsupportedOperationException"
引起的
如果我简化我的代码,这里有一些不起作用:
package be.julot.popularmovies;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.GridView;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Arrays;
import java.util.List;
public class PosterGridFragment extends Fragment {
private MoviePosterItemAdapter moviePosterAdapter;
public PosterGridFragment() {}
MoviePosterItem[] moviePosterItems = {
new MoviePosterItem("Test movie", "7.6", R.drawable.test),
new MoviePosterItem("Dude, where is my car?", "2.2", R.drawable.test),
new MoviePosterItem("Yoooo", "7.2", R.drawable.test),
new MoviePosterItem("Ulysse is here", "5.4", R.drawable.test),
new MoviePosterItem("Come on baby", "7.9", R.drawable.test),
new MoviePosterItem("Limit title to 30 chars please", "5.3", R.drawable.test),
new MoviePosterItem("Doesn't he?", "9.1", R.drawable.test),
new MoviePosterItem("Internetar", "2.4", R.drawable.test)
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.poster_grid_fragment, container, false);
moviePosterAdapter = new MoviePosterItemAdapter(getActivity(), Arrays.asList(moviePosterItems));
GridView posterGrid = (GridView) rootView.findViewById(R.id.movie_grid);
posterGrid.setAdapter(moviePosterAdapter);
moviePosterAdapter.clear();
return rootView;
}
问题发生在 moviePosterAdapter.clear();
通常,我在其他地方调用 clear() 方法(在 ASyncTask 的 onPostExecute 中),但问题是一样的。
我的自定义适配器扩展 ArrayAdapter 如下:
package be.julot.popularmovies;
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.List;
public class MoviePosterItemAdapter extends ArrayAdapter<MoviePosterItem> {
private final String LOG_TAG = MoviePosterItemAdapter.class.getSimpleName();
public MoviePosterItemAdapter(Activity context, List<MoviePosterItem> moviePosterItems) {
super(context, 0, moviePosterItems);
}
@Override
public View getView(int position, View view, ViewGroup parent){
MoviePosterItem moviePosterItem = getItem(position);
if (view == null) {
view = LayoutInflater.from(getContext()).inflate(R.layout.movies_grid_item, parent, false);
}
ImageView posterImage = (ImageView) view.findViewById(R.id.posterImage);
posterImage.setImageResource(moviePosterItem.moviePoster);
TextView movieTitle = (TextView) view.findViewById(R.id.movie_title);
movieTitle.setText(moviePosterItem.movieTitle);
return view;
}
}
我是否应该覆盖自定义适配器中的 clear() 方法 class?我看过原方法,但我看不到该怎么做。
这是我的 class 自定义项目:
package be.julot.popularmovies;
//Defines each item in the movie poster grid. Each item shows a title, the average of votes and the
//movie poster in background. See movies_grid_item.xml
import java.util.ArrayList;
public class MoviePosterItem {
String movieTitle;
String movieAverageVote;
int moviePoster;
public MoviePosterItem(String mTitle, String mAverageVote, int mPoster) {
this.movieTitle = mTitle;
this.movieAverageVote = mAverageVote;
this.moviePoster = mPoster;
}
}
非常感谢您提供的任何答案或关于如何自己找到它的任何线索!我看过类似的帖子,但无法找出我的代码有什么问题。
在 Frgament 的 onActivityCreated 中填充您的适配器。
您的 Android 代码没问题,这里的 Java 数组操作技术有问题。您将 Arrays.asList()
传递给您的适配器 - 此方法 returns 是一个固定大小的数组,因此您无法向其中删除或添加元素。这会一直存储到 ArrayAdapter
(在 mObjects
中),当您对其调用 clear 时,您会遇到一个很好的例外,即尝试做一些您不应该做的事情。
所以它是:
moviePosterAdapter = new MoviePosterItemAdapter(getActivity(), new ArrayList<>(Arrays.asList(moviePosterItems)));
或
- 将原始数组构造为常规
ArrayList (new ArrayList<>() + add(new MoviePosterItem()) * N)
我是 Android 开发人员的新手,我不是那种在没有先进行深入研究的情况下提出问题(这实际上是我的第一次)的人,但我被困住了...
我创建了一个自定义适配器来填充 gridview,并且使用假数据一切正常。但是当涉及到清除数据时,就出现了问题。我的日志说这是由 "java.lang.UsupportedOperationException"
引起的如果我简化我的代码,这里有一些不起作用:
package be.julot.popularmovies;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.GridView;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Arrays;
import java.util.List;
public class PosterGridFragment extends Fragment {
private MoviePosterItemAdapter moviePosterAdapter;
public PosterGridFragment() {}
MoviePosterItem[] moviePosterItems = {
new MoviePosterItem("Test movie", "7.6", R.drawable.test),
new MoviePosterItem("Dude, where is my car?", "2.2", R.drawable.test),
new MoviePosterItem("Yoooo", "7.2", R.drawable.test),
new MoviePosterItem("Ulysse is here", "5.4", R.drawable.test),
new MoviePosterItem("Come on baby", "7.9", R.drawable.test),
new MoviePosterItem("Limit title to 30 chars please", "5.3", R.drawable.test),
new MoviePosterItem("Doesn't he?", "9.1", R.drawable.test),
new MoviePosterItem("Internetar", "2.4", R.drawable.test)
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.poster_grid_fragment, container, false);
moviePosterAdapter = new MoviePosterItemAdapter(getActivity(), Arrays.asList(moviePosterItems));
GridView posterGrid = (GridView) rootView.findViewById(R.id.movie_grid);
posterGrid.setAdapter(moviePosterAdapter);
moviePosterAdapter.clear();
return rootView;
}
问题发生在 moviePosterAdapter.clear(); 通常,我在其他地方调用 clear() 方法(在 ASyncTask 的 onPostExecute 中),但问题是一样的。
我的自定义适配器扩展 ArrayAdapter 如下:
package be.julot.popularmovies;
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.List;
public class MoviePosterItemAdapter extends ArrayAdapter<MoviePosterItem> {
private final String LOG_TAG = MoviePosterItemAdapter.class.getSimpleName();
public MoviePosterItemAdapter(Activity context, List<MoviePosterItem> moviePosterItems) {
super(context, 0, moviePosterItems);
}
@Override
public View getView(int position, View view, ViewGroup parent){
MoviePosterItem moviePosterItem = getItem(position);
if (view == null) {
view = LayoutInflater.from(getContext()).inflate(R.layout.movies_grid_item, parent, false);
}
ImageView posterImage = (ImageView) view.findViewById(R.id.posterImage);
posterImage.setImageResource(moviePosterItem.moviePoster);
TextView movieTitle = (TextView) view.findViewById(R.id.movie_title);
movieTitle.setText(moviePosterItem.movieTitle);
return view;
}
}
我是否应该覆盖自定义适配器中的 clear() 方法 class?我看过原方法,但我看不到该怎么做。
这是我的 class 自定义项目:
package be.julot.popularmovies;
//Defines each item in the movie poster grid. Each item shows a title, the average of votes and the
//movie poster in background. See movies_grid_item.xml
import java.util.ArrayList;
public class MoviePosterItem {
String movieTitle;
String movieAverageVote;
int moviePoster;
public MoviePosterItem(String mTitle, String mAverageVote, int mPoster) {
this.movieTitle = mTitle;
this.movieAverageVote = mAverageVote;
this.moviePoster = mPoster;
}
}
非常感谢您提供的任何答案或关于如何自己找到它的任何线索!我看过类似的帖子,但无法找出我的代码有什么问题。
在 Frgament 的 onActivityCreated 中填充您的适配器。
您的 Android 代码没问题,这里的 Java 数组操作技术有问题。您将 Arrays.asList()
传递给您的适配器 - 此方法 returns 是一个固定大小的数组,因此您无法向其中删除或添加元素。这会一直存储到 ArrayAdapter
(在 mObjects
中),当您对其调用 clear 时,您会遇到一个很好的例外,即尝试做一些您不应该做的事情。
所以它是:
moviePosterAdapter = new MoviePosterItemAdapter(getActivity(), new ArrayList<>(Arrays.asList(moviePosterItems)));
或
- 将原始数组构造为常规
ArrayList (new ArrayList<>() + add(new MoviePosterItem()) * N)