java - Recyclerview 和 Rest Api

标签 java android android-asynctask

我通过 RestApi 获取 MS Sql Server 的数据,但无法在 Recyclerview 上设置。我读取了数据库名称和图像 url 的两个 String 对象。

我不能只在 Recyclerviewadapter 上设置数据

请帮助我或向我展示正确的示例

MainActivity.java

public class MainActivity extends AppCompatActivity {

private List<SingleItemModel> feedsList;
private RecyclerView mRecyclerView;
private MyRecyclerViewAdapter adapter;
private ProgressBar progressBar;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();
        }
    });

    mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
    progressBar = (ProgressBar) findViewById(R.id.progress_bar);

    new AsyncLoadDeptDetails().execute();
}


protected class AsyncLoadDeptDetails extends
        AsyncTask<Void, JSONObject, ArrayList<SingleItemModel>> {
    ArrayList<SingleItemModel> recModel = null;

    @SuppressWarnings("WrongThread")
    @Override
    protected ArrayList<SingleItemModel> doInBackground(Void... params) {
        // TODO Auto-generated method stub

        RestAPI api = new RestAPI();
        try {

            JSONObject jsonObj = api.SingleItemModel();

            JSONParser parser = new JSONParser();
            recModel = parser.parseDepartment(jsonObj);
            adapter = new MyRecyclerViewAdapter(MainActivity.this, feedsList);
            mRecyclerView.setAdapter(adapter);
            feedsList = new ArrayList<>();

            for (int i = 0; i < jsonObj.length(); i++) {
                JSONObject post = jsonObj.optJSONObject(String.valueOf(i));
                SingleItemModel item = new SingleItemModel(i);
                item.setName(post.optString("title"));
                item.setUrl(post.optString("thumbnail"));
                feedsList.add(item);
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            Log.d("AsyncLoadDeptDetails", e.getMessage());

        }
        return recModel;
    }
  }
}

单项模型

public class SingleItemModel {


private String name;
private String url;


public SingleItemModel(String name, String url) {
    this.name = name;
    this.url = url;
}



public String getUrl() {
    return url;
}

public void setUrl(String url) {
    this.url = url;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

}

MyRecyclerViewAdapter

public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.CustomViewHolder> {
private List<SingleItemModel> singleItemList;
private Context mContext;
private OnItemClickListener onItemClickListener;

public MyRecyclerViewAdapter(Context context, List<SingleItemModel> singleItemList) {
    this.singleItemList = singleItemList;
    this.mContext = context;
}

@Override
public CustomViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_row, null);
    CustomViewHolder viewHolder = new CustomViewHolder(view);
    return viewHolder;
}

@Override
public void onBindViewHolder(CustomViewHolder customViewHolder, int i) {
    final SingleItemModel feedItem = singleItemList.get(i);

    //Download image using picasso library
    if (!TextUtils.isEmpty(feedItem.getUrl())) {
        Picasso.with(mContext).load(feedItem.getUrl())
                .error(R.drawable.placeholder)
                .placeholder(R.drawable.placeholder)
                .into(customViewHolder.imageView);
    }

    //Setting text view title
    customViewHolder.textView.setText(feedItem.getName());


    View.OnClickListener listener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            onItemClickListener.onItemClick(feedItem);
        }
    };
    customViewHolder.imageView.setOnClickListener(listener);
    customViewHolder.textView.setOnClickListener(listener);
}

@Override
public int getItemCount() {
    return (null != singleItemList ? singleItemList.size() : 0);
}


class CustomViewHolder extends RecyclerView.ViewHolder {
    protected ImageView imageView;
    protected TextView textView;

    public CustomViewHolder(View view) {
        super(view);
        this.imageView = (ImageView) view.findViewById(R.id.thumbnail);
        this.textView = (TextView) view.findViewById(R.id.title);
    }
}


public OnItemClickListener getOnItemClickListener() {
    return onItemClickListener;
}

public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
    this.onItemClickListener = onItemClickListener;
}

}

最佳答案

private List<SingleItemModel> feedsList;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    feedList = new ArrayList<SingleItemModle>();
    adapter = new MyRecyclerViewAdapter(MainActivity.this, feedsList);
    mRecyclerView.setAdapter(adapter);

覆盖onPostExecuteAsyncTask调用adapter.notifyDataSetChanged()因为您将项目添加到 feedListdoInBackground .

编辑:

改变这个

   SingleItemModel item = new SingleItemModel(i);

   SingleItemModel item = new SingleItemModel();

模型类中没有将 i 作为参数的构造函数。

关于java - Recyclerview 和 Rest Api,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41715507/

相关文章:

java - 从 PlaceHolderFragment : "' com. 执行 AsyncTask example.Activity.this' 无法从静态上下文引用”

android - 嵌套的 AsyncTask 和 onPostExecute

java - eclipse | System.out.println() 的代码模板

java - 远程ejb方法参数隔离

android - 在 Google map 上使用大量名胜古迹的最佳方式

android - Android 中的 Spotify Intent?

android - 静态异步任务进度条

java - 如何设置 JSP 页面的 URL?

java - 为什么访问这个私有(private)枚举常量需要合成访问器?

android - Polymer 是否支持较低的 Android 版本?