android - 如何在 RecyclerView 中添加刷新滑动

标签 android

我有新闻应用程序,它从 json url 提供新闻文章,我想添加刷新滑动以获取新闻文章。当我刷新布局时,我如何将它添加到我的 MainActivity 和下面我的类:

public class MainActivity extends AppCompatActivity implements ExampleAdapter.OnItemClickListener {
public static final String EXTRA_URL = "imageUrl";
public static final String EXTRA_CREATOR = "creatorName";


private RecyclerView mRecyclerView;
private ExampleAdapter mExampleAdapter;
private ArrayList<ExampleItem> mExampleList;
private RequestQueue mRequestQueue;

String API_KEY = "850e0efe6adf4eb38afefa14d33e4b48"; // ### YOUE NEWS API HERE ###
String NEWS_SOURCE = "bbc-news";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mRecyclerView = findViewById(R.id.recycler_view);
    mRecyclerView.setHasFixedSize(true);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(this));

    mExampleList = new ArrayList<>();

    mRequestQueue = Volley.newRequestQueue(this);
    parseJSON();
}

private void parseJSON() {
    String url = "http://newsapi.org/v1/articles?source="+NEWS_SOURCE+"&sortBy=top&apiKey="+API_KEY;

    JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null,
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    try {
                        JSONArray jsonArray = response.optJSONArray("articles");

                        for (int i = 0; i < jsonArray.length(); i++) {
                            JSONObject hit = jsonArray.getJSONObject(i);

                            String creatorName = hit.getString("title");
                            String imageUrl = hit.getString("urlToImage");


                            mExampleList.add(new ExampleItem(imageUrl, creatorName));
                        }

                        mExampleAdapter = new ExampleAdapter(MainActivity.this, mExampleList);
                        mRecyclerView.setAdapter(mExampleAdapter);
                        mExampleAdapter.setOnItemClickListener(MainActivity.this);

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            error.printStackTrace();
        }
    });

    mRequestQueue.add(request);
}

@Override
public void onItemClick(int position) {
    Intent detailIntent = new Intent(this, DetailActivity.class);
    ExampleItem clickedItem = mExampleList.get(position);

    detailIntent.putExtra(EXTRA_URL, clickedItem.getImageUrl());
    detailIntent.putExtra(EXTRA_CREATOR, clickedItem.getCreator());

    startActivity(detailIntent);
}
 }

示例适配器.java

public class ExampleAdapter extends RecyclerView.Adapter<ExampleAdapter.ExampleViewHolder> {
private Context mContext;
private ArrayList<ExampleItem> mExampleList;
private OnItemClickListener mListener;

public interface OnItemClickListener {
    void onItemClick(int position);
}

public void setOnItemClickListener(OnItemClickListener listener) {
    mListener = listener;
}

public ExampleAdapter(Context context, ArrayList<ExampleItem> exampleList) {
    mContext = context;
    mExampleList = exampleList;
}

@Override
public ExampleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(mContext).inflate(R.layout.example_item, parent, false);
    return new ExampleViewHolder(v);
}

@Override
public void onBindViewHolder(ExampleViewHolder holder, int position) {
    ExampleItem currentItem = mExampleList.get(position);

    String imageUrl = currentItem.getImageUrl();
    String creatorName = currentItem.getCreator();


    holder.mTextViewCreator.setText(creatorName);

    Picasso.with(mContext).load(imageUrl).fit().centerInside().into(holder.mImageView);
}

@Override
public int getItemCount() {
    return mExampleList.size();
}

public class ExampleViewHolder extends RecyclerView.ViewHolder {
    public ImageView mImageView;
    public TextView mTextViewCreator;
    public TextView mTextViewLikes;

    public ExampleViewHolder(View itemView) {
        super(itemView);
        mImageView = itemView.findViewById(R.id.image_view);
        mTextViewCreator = itemView.findViewById(R.id.text_view_creator);
        mTextViewLikes = itemView.findViewById(R.id.text_view_likes);

        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mListener != null) {
                    int position = getAdapterPosition();
                    if (position != RecyclerView.NO_POSITION) {
                        mListener.onItemClick(position);
                    }
                }
            }
        });
    }
}
 }

Exampleitem.java

public class ExampleItem {
private String mImageUrl;
private String mCreator;

public ExampleItem(String imageUrl, String creator) {
    mImageUrl = imageUrl;
    mCreator = creator;

}

public String getImageUrl() {
    return mImageUrl;
}

public String getCreator() {
    return mCreator;
}

}

activity_main.xml

   <?xml version="1.0" encoding="utf-8"?>
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
  tools:context="recylerviewjsonexample.codinginflow.com
.recylerviewjsonexample.MainActivity">

 <android.support.v7.widget.RecyclerView
    android:id="@+id/recycler_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/darker_gray" />

exmple_item.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
app:cardCornerRadius="8dp">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="16dp">

    <ImageView
        android:id="@+id/image_view"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:src="@mipmap/ic_launcher" />

    <TextView
        android:id="@+id/text_view_creator"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Creator Name"
        android:textColor="@android:color/black"
        android:textSize="20sp" />

    <TextView
        android:id="@+id/text_view_likes"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Like: " />

</LinearLayout>

</android.support.v7.widget.CardView>

最佳答案

在您的 XML 文件中

<android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/refreshLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

            <android.support.v7.widget.RecyclerView
                android:id="@+id/recycler"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />

    </android.support.v4.widget.SwipeRefreshLayout>

在您的 java 类中,您将清除旧列表并再次调用您的 API 方法

binding.refreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                if (data_list != null) {
                    data_list.clear();
                }

                CallyourMethod();
                binding.refreshLayout.setRefreshing(false);
            }
        });

关于android - 如何在 RecyclerView 中添加刷新滑动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53468846/

相关文章:

java - Realm RecyclerView,如何按天创建标题。或者将同一天合并成一行

android - 多模块应用程序上的 Proguard

java - 对象上的 SetText 不适用于日历

android - 如何使用 MediaCodec API 调用我的自定义解码器

android - 从安卓市场安装。未知原因 102

android - 设置 Spinner 项目的文本字体

java - 使用 Android FileProvider 删除文件时出现 NullPointerException

java - 打开跟踪文件 : No such file or directory(2) (1) no such table: ContactListTable Tried for hours can't find solution 时出错

android - MediaStore.Images.Media.insertImage - java.io.FileNotFoundException - Android

android - 找不到默认 Activity (Android Studio 0.6.1)