Androidはドロップダウン・リフレッシュとアップロード・データ(ネットワーク要求データ)を実現
17052 ワード
概要
アンドロイドの開発では、アップロードやドロップダウンリフレッシュの機能によく遭遇し、ネットワークリクエストでデータを入手してコントロールに追加し、以前は自分もネットでいくつかの文章を検索したことがあるが、基本的にはあまり役に立たず、効果が異なるか、貼られたコードが不完全で、機能が正常に使用できない(卵が痛い)ため、しばらく模索した後、ほぼOKなdemoを完成した.皆さんの参考に供します.問題があったら皆さんに指摘していただき、感謝の気持ちでいっぱいです.
古いしきたりで,まず効果図を貼る
使用するコントロールとツールの概要: RefreshLayout(プルアップロードドロップダウンリフレッシュコントロール) Adapter(データをロードするアダプタ) RecyclerView(データをロードするviewコントロール) Handler(ネットワーク通信) さあ、コードをつけましょう!!!
ネットワークを使用している以上、ネットワーク権限を入れなければなりません.
レイアウトXML:
注:このSmartRefreshLayoutはカスタムフレームワークで、GitHubから来ています.gradleに追加すればいいです.
MainActivity.class
注:本文の注釈はかなりはっきり書いてあるので、あまり説明しません.
JokeLVAdapter.class
注:同じように、注釈は簡単明瞭で、くだらない話は多くありません.続行、次へ:
次のステップはないようですが、実は、全体の机能には难しいところはありません.コードを理解して、自分のプロジェクトの中で上手に使うことができればいいです.ニーズに応じて异なる実现方法をカスタマイズすることができます.ここのこの方法はただのものです.参考にしてください.また、どんな良い方法があるかをお勧めします.コードの不足も指摘できます.静かに皆さんの佳音を待っています!!
Demoソースを添付しますが、GitHubがあまり熟練していないので、ここのリンクはcsdnです.
ここをクリックしてソースをダウンロードして、早く、私をスタンプして...
本稿ではGitHubのリフレッシュフレームワークを参照し、解釈権を持たないので、リフレッシュフレームワークをさらに理解したい場合は、次のアドレスでお読みください.https://github.com/scwang90/SmartRefreshLayout
q:486789970 email:[email protected]
何か問題があれば、皆さんの指導を歓迎します.文章を通じて学び合いたい.
アンドロイドの開発では、アップロードやドロップダウンリフレッシュの機能によく遭遇し、ネットワークリクエストでデータを入手してコントロールに追加し、以前は自分もネットでいくつかの文章を検索したことがあるが、基本的にはあまり役に立たず、効果が異なるか、貼られたコードが不完全で、機能が正常に使用できない(卵が痛い)ため、しばらく模索した後、ほぼOKなdemoを完成した.皆さんの参考に供します.問題があったら皆さんに指摘していただき、感謝の気持ちでいっぱいです.
古いしきたりで,まず効果図を貼る
使用するコントロールとツールの概要:
ネットワークを使用している以上、ネットワーク権限を入れなければなりません.
レイアウトXML:
注:このSmartRefreshLayoutはカスタムフレームワークで、GitHubから来ています.gradleに追加すればいいです.
MainActivity.class
/**
* activity
*/
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
/** activity */
Activity activity = this;
/** key */
public static String Joke_APPKEY = "e9bbc8a5de090451bd5da96dc574a94a";
/** URL */
public static final String HTTPURLS = "http://v.juhe.cn/joke/randJoke.php?";
/** */
private static Animation rotateAnimation;
/** */
static final int SUCC_CODE = 0;
/** */
ImageView joke_img_back, joke_img_load;
/** RV */
RecyclerView joke_rv;
/** */
JokeLVAdapter adapter;
/** , false */
boolean isRef, isLoad = false;
/** swf: */
RefreshLayout activity_joke_refreshLayout;
/** handler handleMessage */
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
// , adapter
if(msg.arg1 == SUCC_CODE && isLoad || isRef){
adapter.notifyDataSetChanged();
}
// , , RV
else if(msg.arg1 == SUCC_CODE){
joke_img_load.clearAnimation();
joke_img_load.setVisibility(View.GONE);
adapter = new JokeLVAdapter(activity, datas);
joke_rv.setLayoutManager(new LinearLayoutManager(activity));
joke_rv.setAdapter(adapter);
// rv item , openWindow
adapter.setLinster(new JokeLVAdapter.ItemOnClickLinster() {
@Override
public void textItemOnClick(View view, int position) {
Log.i("activity", "----->position=" + position);
//
openWindow(position);
}
});
}else{
// , ,
joke_img_load.clearAnimation();
joke_img_load.setVisibility(View.GONE);
Toast.makeText(activity, R.string.getDataError, Toast.LENGTH_SHORT).show();
}
}
};
/**
* position
* @param position
*/
private void openWindow(int position) {
Toast.makeText(activity, " item " + position, Toast.LENGTH_SHORT).show();
}
/** , */
List datas = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
initView();
initData();
//
StatusBarCompat.setStatusBarColor(activity, ContextCompat.getColor(activity, R.color.cyan));
}
public void initView() {
// id
joke_img_back = findViewById(R.id.joke_img_back);
joke_img_load = findViewById(R.id.joke_img_load);
joke_rv = findViewById(R.id.joke_rv);
activity_joke_refreshLayout = findViewById(R.id.activity_joke_refreshLayout);
// refreshLayout
//
activity_joke_refreshLayout.setEnableOverScrollBounce(false);
//
activity_joke_refreshLayout.setDisableContentWhenRefresh(true);
activity_joke_refreshLayout.setDisableContentWhenLoading(true);
// ( true)
activity_joke_refreshLayout.setEnableAutoLoadmore(false);
/**
*
*/
activity_joke_refreshLayout.setOnRefreshListener(new OnRefreshListener() {
@Override
public void onRefresh(RefreshLayout refreshlayout) {
Log.i("activity", " ");
//
isRef = true;
handler.post(getRefreshDatas);
}
});
/**
*
*/
activity_joke_refreshLayout.setOnLoadmoreListener(new OnLoadmoreListener() {
@Override
public void onLoadmore(RefreshLayout refreshlayout) {
Log.i("activity", " ");
isLoad = true;
handler.post(getLoadmoreDatas);
}
});
//
joke_img_back.setOnClickListener(this);
}
public void initData() {
// xml ,
joke_img_load.setVisibility(View.VISIBLE);
openA(activity, joke_img_load);
//
handler.post(getDatas);
}
/**
* getDatas
*/
Runnable getDatas = new Runnable() {
@Override
public void run() {
HttpRequest.get(HTTPURLS + "&key=" + Joke_APPKEY, new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.i("activity", " ");
String result = response.body().string();
JsonDta(result);
}
});
}
};
/**
* json
* @param result
*/
private void JsonDta(String result) {
Message message = handler.obtainMessage();
// json SJJokeNow
SJJokeNow obj = new Gson().fromJson(result, SJJokeNow.class);
// , handler
if(obj.getError_code() != 0){
message.arg1 = obj.getError_code();
handler.sendMessage(message);
}else {
// ,
if(isRef){
Log.i("activity", "------>" + obj.getReason());
List json = new ArrayList<>();
for (int i = 0; i < obj.getResult().size(); i ++){
JokesNew info = new JokesNew();
info.setHashId(obj.getResult().get(i).getHashId());
info.setContent(obj.getResult().get(i).getContent());
info.setUnixtime(obj.getResult().get(i).getUnixtime());
json.add(info);
}
for(int i = 0 ; i < datas.size() ; i++) {
json.add(datas.get(i));
}
datas.clear();
for(int i = 0 ; i < json.size() ; i++) {
datas.add(json.get(i));
}
isRef = false;
}else {
Log.i("activity", "------>" + obj.getReason());
for (int i = 0; i < obj.getResult().size(); i ++){
JokesNew info = new JokesNew();
info.setHashId(obj.getResult().get(i).getHashId());
info.setContent(obj.getResult().get(i).getContent());
info.setUnixtime(obj.getResult().get(i).getUnixtime());
datas.add(info);
}
}
message.arg1 = obj.getError_code();
handler.sendMessage(message);
}
}
/**
*
*/
Runnable getRefreshDatas = new Runnable() {
@Override
public void run() {
HttpRequest.get(HTTPURLS + "&key=" + Joke_APPKEY, new Callback() {
@Override
public void onFailure(Call call, IOException e) {
activity_joke_refreshLayout.finishRefresh(0000 , false);
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.i("activity", " ");
activity_joke_refreshLayout.finishRefresh(0000 , true);
String result = response.body().string();
JsonDta(result);
}
});
}
};
/**
*
*/
Runnable getLoadmoreDatas = new Runnable() {
@Override
public void run() {
HttpRequest.get(HTTPURLS + "&key=" + Joke_APPKEY, new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
activity_joke_refreshLayout.finishLoadmore(0000 , false);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.i("activity", " ");
activity_joke_refreshLayout.finishLoadmore(0000 , true);
String result = response.body().string();
JsonDta(result);
}
});
}
};
@Override
public void onClick(View v) {
int temdId = v.getId();
if(temdId == R.id.joke_img_back){
finish();
}
}
/**
*
* @param img
*/
public static void openA(Activity activity, ImageView img){
// loading
rotateAnimation = AnimationUtils.loadAnimation(activity, R.anim.loading);
LinearInterpolator interpolator = new LinearInterpolator();
rotateAnimation.setInterpolator(interpolator);
img.startAnimation(rotateAnimation);
}
}
注:本文の注釈はかなりはっきり書いてあるので、あまり説明しません.
JokeLVAdapter.class
/**
*
*/
public class JokeLVAdapter extends RecyclerView.Adapter {
/** */
Activity context;
/** */
List data;
/** */
LayoutInflater inflater;
/**
* , , 。
*/
LruCache mMemoryCache;
/**
* data activity
* @param activity
* @param datas
*/
public JokeLVAdapter(Activity activity, List datas){
this.context = activity;
this.data = datas;
//
inflater = LayoutInflater.from(activity);
//
int maxMemory = (int) Runtime.getRuntime().maxMemory();
int cacheSize = maxMemory / 8;
mMemoryCache = new LruCache(cacheSize) {
@Override
protected int sizeOf(String key, BitmapDrawable drawable) {
return drawable.getBitmap().getByteCount();
}
};
}
/**
* , activity onCreate
* @param parent
* @param viewType
* @return
*/
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.joke_lv_item, parent, false);
return new ViewHolder(view);
}
/**
*
* @param viewHolder
* @param position
*/
@Override
public void onBindViewHolder(final ViewHolder viewHolder, int position) {
viewHolder.joke_lv_txtconent.setText(data.get(position).getContent());
viewHolder.joke_lv_txttime.setText(" :" + data.get(position).getUnixtime() + "");
// tag
viewHolder.itemView.setTag(position);
}
/**
*
* @return
*/
@Override
public int getItemCount() {
return data.size();
}
/**
* // ViewHolder, Item
*/
public class ViewHolder extends RecyclerView.ViewHolder {
/** item */
public TextView joke_lv_txttime;
public TextView joke_lv_txtconent;
public LinearLayout lin_alljoke;
public ViewHolder(View rootView) {
super(rootView);
this.joke_lv_txtconent = rootView.findViewById(R.id.joke_lv_txtconent);
this.joke_lv_txttime = rootView.findViewById(R.id.joke_lv_txttime);
this.lin_alljoke = rootView.findViewById(R.id.lin_alljoke);
// item
this.lin_alljoke.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Linster.textItemOnClick(v, getPosition());
}
});
}
}
public ItemOnClickLinster Linster;
public void setLinster(ItemOnClickLinster linster) {
Linster = linster;
}
public interface ItemOnClickLinster{
void textItemOnClick(View view, int position);
}
}
注:同じように、注釈は簡単明瞭で、くだらない話は多くありません.続行、次へ:
次のステップはないようですが、実は、全体の机能には难しいところはありません.コードを理解して、自分のプロジェクトの中で上手に使うことができればいいです.ニーズに応じて异なる実现方法をカスタマイズすることができます.ここのこの方法はただのものです.参考にしてください.また、どんな良い方法があるかをお勧めします.コードの不足も指摘できます.静かに皆さんの佳音を待っています!!
Demoソースを添付しますが、GitHubがあまり熟練していないので、ここのリンクはcsdnです.
ここをクリックしてソースをダウンロードして、早く、私をスタンプして...
本稿ではGitHubのリフレッシュフレームワークを参照し、解釈権を持たないので、リフレッシュフレームワークをさらに理解したい場合は、次のアドレスでお読みください.https://github.com/scwang90/SmartRefreshLayout
q:486789970 email:[email protected]
何か問題があれば、皆さんの指導を歓迎します.文章を通じて学び合いたい.
---