问题详情/问题详情-邀请页面/问题详情-回答编辑页面

This commit is contained in:
kehaoyuan
2017-12-08 14:47:27 +08:00
parent 19e394abb8
commit 40c55e716d
26 changed files with 915 additions and 2 deletions

View File

@ -0,0 +1,31 @@
package com.gh.gamecenter;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import com.gh.base.BaseActivity;
import com.gh.gamecenter.questionsdetail.AnswerEditFragment;
/**
* Created by khy on 7/12/17.
*/
public class AskQuestionsDetailActivity extends BaseActivity {
public static Intent getIntent(Context context) {
return new Intent(context, AskQuestionsDetailActivity.class);
}
@Override
protected int getLayoutId() {
return R.layout.activity_ask_questionsdetail;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getSupportFragmentManager().beginTransaction().replace(
R.id.layout_fragment_content, new AnswerEditFragment()).commitAllowingStateLoss();
}
}

View File

@ -2,6 +2,7 @@ package com.gh.gamecenter.ask;
import android.view.View;
import com.gh.gamecenter.AskQuestionsDetailActivity;
import com.gh.gamecenter.R;
import com.gh.gamecenter.baselist.BaseListAdapter;
import com.gh.gamecenter.baselist.ListFragment;
@ -43,7 +44,7 @@ public class AskHotFragment extends ListFragment {
}
break;
case R.id.ask_item_constraintlayout:
// todo
startActivity(AskQuestionsDetailActivity.getIntent(getContext()));
break;
}

View File

@ -60,6 +60,8 @@ public abstract class ListFragment<T> extends BaseFragment implements
mListViewModel = ViewModelProviders.of(this, factory).get(ListViewModel.class);
mListViewModel.getObsListData().observe(this, this);
mListViewModel.load(LoadType.nomarl);
mListRv.addItemDecoration(new VerticalItemDecoration(getContext(), 8, true));
}
@Override
@ -69,7 +71,6 @@ public abstract class ListFragment<T> extends BaseFragment implements
mLayoutManager = new LinearLayoutManager(getContext());
mListRv.setLayoutManager(mLayoutManager);
mListRv.setAdapter(provideListAdapter());
mListRv.addItemDecoration(new VerticalItemDecoration(getContext(), 8, true));
mListRv.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {

View File

@ -0,0 +1,152 @@
package com.gh.gamecenter.questionsdetail;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.text.Editable;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.ImageSpan;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import com.gh.base.fragment.BaseFragment;
import com.gh.gamecenter.R;
import com.lightgame.utils.Utils;
import java.io.FileOutputStream;
import butterknife.BindView;
import butterknife.OnClick;
import static com.gh.gamecenter.SelectUserIconActivity.MEDIA_ICON_REQUEST;
/**
* Created by khy on 7/12/17.
*/
public class AnswerEditFragment extends BaseFragment {
@BindView(R.id.answer_edit_title)
TextView mTitle;
@BindView(R.id.answer_edit_content)
EditText mEditContent;
@BindView(R.id.answer_edit_img_icon)
ImageView mImgIcon;
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (data != null && requestCode == MEDIA_ICON_REQUEST) {
Uri selectedImage = data.getData();
if (selectedImage == null || getActivity() == null) {
return;
}
String[] filePathColumn = {MediaStore.Images.Media.DATA};
Cursor cursor = getActivity().getContentResolver().query(selectedImage, filePathColumn, null, null, null);
if (cursor == null) {
return;
}
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String picturePath = cursor.getString(columnIndex);
cursor.close();
Bitmap bitmap = compressPicture(picturePath);
insertPicToEt(bitmap); // todo 插入图片前应该向服务器提交图片
Utils.log("picturePath = " + picturePath);
}
}
@Override
protected int getLayoutId() {
return R.layout.fragment_answer_edit;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
}
/**
* 压缩图片
* 规则:
* 1.如果图片大于当前EditText的最大宽度则按比例缩放使图片宽度和EditText的宽度保持一致 (高度不处理)
* 2.如果图片小于当前EditText 由于比例限制 将不处理
* @param srcPath 图片路径
* @return
*/
public Bitmap compressPicture(String srcPath) {
FileOutputStream fos = null;
BitmapFactory.Options op = new BitmapFactory.Options();
// 开始读入图片此时把options.inJustDecodeBounds 设回true了
op.inJustDecodeBounds = true;
Bitmap bitmap = BitmapFactory.decodeFile(srcPath, op);
op.inJustDecodeBounds = false;
// 缩放图片的尺寸
float w = op.outWidth;
float h = op.outHeight;
float index = w/h;
int width = mEditContent.getWidth();
float hh = width/index;
float ww = width;
float be = 1.0f;
if (w > h && w > ww) {
be = (float) (w / ww);
} else if (w < h && h > hh) {
be = (float) (h / hh);
}
if (be <= 0) {
be = 1.0f;
}
op.inSampleSize = (int) be;// 设置缩放比例,这个数字越大,图片大小越小.
// 重新读入图片注意此时已经把options.inJustDecodeBounds 设回false了
bitmap = BitmapFactory.decodeFile(srcPath, op);
int desWidth = (int) (w / be);
int desHeight = (int) (h / be);
return Bitmap.createScaledBitmap(bitmap, desWidth, desHeight, true);
}
@OnClick(R.id.answer_edit_img_icon)
public void onClick(View view) {
if (view.getId() == R.id.answer_edit_img_icon) {
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, MEDIA_ICON_REQUEST);
}
}
private void insertPicToEt(Bitmap bitmap) {
if (bitmap == null) return;
ImageSpan imageSpan = new ImageSpan(getContext(), bitmap);
int index = mEditContent.getSelectionStart();
String tempUrl = "<img src=\"" + "dasdasdasdasddasd" + "\" />";
SpannableString spannableString = new SpannableString(tempUrl);
spannableString.setSpan(imageSpan, 0, tempUrl.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
Editable editableText = mEditContent.getEditableText();
if (index < 0 || index >= editableText.length()) {
editableText.append(spannableString);
} else {
editableText.insert(index, spannableString);
}
Utils.log("insertPicToEt = ");
}
}

View File

@ -0,0 +1,102 @@
package com.gh.gamecenter.questionsdetail;
import android.content.Context;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.gh.base.OnListClickListener;
import com.gh.common.constant.ItemViewType;
import com.gh.gamecenter.R;
import com.gh.gamecenter.adapter.viewholder.ReuseViewHolder;
import com.gh.gamecenter.ask.AskItemViewHolder;
import com.lightgame.adapter.BaseRecyclerAdapter;
/**
* Created by khy on 7/12/17.
*/
public class QuestionsDetailAdapter extends BaseRecyclerAdapter {
private OnListClickListener mListClickListener;
public QuestionsDetailAdapter(Context context, OnListClickListener listClickListener) {
super(context);
mListClickListener = listClickListener;
}
@Override
public int getItemViewType(int position) {
if (position == 0) {
return ItemViewType.ITEM_TOP;
} else if (position == getItemCount() - 1) {
return ItemViewType.ITEM_FOOTER;
} else {
return ItemViewType.ITEM_BODY;
}
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view;
switch (viewType) {
case ItemViewType.ITEM_TOP:
view = mLayoutInflater.inflate(R.layout.questionsdetail_item, parent, false);
return new QuestionsDetailItemViewHolder(view, null, mListClickListener);
case ItemViewType.ITEM_FOOTER:
view = mLayoutInflater.inflate(R.layout.questionsdetail_footer_item, parent, false);
return new ReuseViewHolder(view);
case ItemViewType.ITEM_BODY:
view = mLayoutInflater.inflate(R.layout.ask_hot_item, parent, false);
return new AskItemViewHolder(view, null, mListClickListener);
default:
return null;
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
switch (getItemViewType(position)) {
case ItemViewType.ITEM_TOP:
initQuestionsDetailItemViewHolder((QuestionsDetailItemViewHolder) holder);
break;
case ItemViewType.ITEM_FOOTER:
break;
case ItemViewType.ITEM_BODY:
break;
}
}
private void initQuestionsDetailItemViewHolder(QuestionsDetailItemViewHolder holder) {
holder.mTagRv.setLayoutManager(new LinearLayoutManager(mContext, RecyclerView.HORIZONTAL, false));
holder.mTagRv.setAdapter(new RecyclerView.Adapter() {
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = mLayoutInflater.inflate(R.layout.questionsdetail_tag_item, parent, false);
return new ReuseViewHolder(view);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
View item = holder.itemView;
if (item instanceof TextView) {
TextView tag = (TextView) item;
}
}
@Override
public int getItemCount() {
return 0;
}
});
}
@Override
public int getItemCount() {
return 0;
}
}

View File

@ -0,0 +1,54 @@
package com.gh.gamecenter.questionsdetail;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.RelativeLayout;
import com.gh.base.fragment.BaseFragment;
import com.gh.gamecenter.R;
import butterknife.BindView;
import butterknife.OnClick;
/**
* Created by khy on 7/12/17.
*/
public class QuestionsDetailFragment extends BaseFragment {
@BindView(R.id.questionsdetail_rv)
RecyclerView mRecyclerView;
@BindView(R.id.questionsdetail_answer)
RelativeLayout mAnswer;
@BindView(R.id.questionsdetail_invite)
RelativeLayout mInvite;
QuestionsDetailAdapter mAdapter;
@Override
protected int getLayoutId() {
return R.layout.fragment_questionsdetail;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mAdapter = new QuestionsDetailAdapter(getContext(), this);
mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
mRecyclerView.setAdapter(mAdapter);
}
@OnClick({R.id.questionsdetail_answer, R.id.questionsdetail_invite})
public void onClick(View v) {
switch (v.getId()) {
case R.id.questionsdetail_answer:
break;
case R.id.questionsdetail_invite:
break;
}
}
}

View File

@ -0,0 +1,41 @@
package com.gh.gamecenter.questionsdetail;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.TextView;
import com.facebook.drawee.view.SimpleDraweeView;
import com.gh.base.BaseRecyclerViewHolder;
import com.gh.base.OnListClickListener;
import com.gh.gamecenter.R;
import butterknife.BindView;
/**
* Created by khy on 7/12/17.
*/
public class QuestionsDetailItemViewHolder extends BaseRecyclerViewHolder {
@BindView(R.id.questionsdetail_item_tagrv)
public RecyclerView mTagRv;
@BindView(R.id.questionsdetail_item_title)
public TextView mTitle;
@BindView(R.id.questionsdetail_item_des)
public TextView mDes;
@BindView(R.id.questionsdetail_item_pic1)
public SimpleDraweeView mPic1;
@BindView(R.id.questionsdetail_item_pic2)
public SimpleDraweeView mPic2;
@BindView(R.id.questionsdetail_item_pic3)
public SimpleDraweeView mPic3;
@BindView(R.id.questionsdetail_item_answercount)
public TextView mAnswercount;
@BindView(R.id.questionsdetail_item_concern)
public TextView mConcern;
public QuestionsDetailItemViewHolder(View itemView, Object data, OnListClickListener listClickListener) {
super(itemView, data, listClickListener);
itemView.setOnClickListener(this);
mConcern.setOnClickListener(this);
}
}

View File

@ -0,0 +1,85 @@
package com.gh.gamecenter.questionsdetail;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import com.gh.base.OnListClickListener;
import com.gh.common.constant.ItemViewType;
import com.gh.gamecenter.R;
import com.gh.gamecenter.adapter.viewholder.FooterViewHolder;
import com.gh.gamecenter.baselist.BaseListAdapter;
import com.gh.gamecenter.baselist.LoadStatus;
import java.util.List;
/**
* Created by khy on 7/12/17.
*/
public class QuestionsInviteAdapter extends BaseListAdapter {
private OnListClickListener mListClickListener;
public QuestionsInviteAdapter(Context context, OnListClickListener listClickListener) {
super(context);
mListClickListener = listClickListener;
}
@Override
protected <T> void provideListData(List<T> listData) {
}
@Override
protected void loadChange(LoadStatus status) {
}
@Override
public int getItemViewType(int position) {
if (position == 0) {
return ItemViewType.ITEM_TOP;
} else if (position == getItemCount() - 1) {
return ItemViewType.ITEM_FOOTER;
} else {
return ItemViewType.ITEM_BODY;
}
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view;
switch (viewType) {
case ItemViewType.ITEM_TOP:
view = mLayoutInflater.inflate(R.layout.questionsinvite_top_item, parent, false);
return new QuestionsInviteTopItemViewHolder(view, null, mListClickListener);
case ItemViewType.ITEM_FOOTER:
view = mLayoutInflater.inflate(R.layout.refresh_footerview, parent, false);
return new FooterViewHolder(view, null, mListClickListener);
case ItemViewType.ITEM_BODY:
view = mLayoutInflater.inflate(R.layout.questionsinvite_item, parent, false);
return new QuestionsInviteItemViewHolder(view, null, mListClickListener);
default:
return null;
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
switch (getItemViewType(position)) {
case ItemViewType.ITEM_TOP:
break;
case ItemViewType.ITEM_FOOTER:
break;
case ItemViewType.ITEM_BODY:
break;
}
}
@Override
public int getItemCount() {
return 0;
}
}

View File

@ -0,0 +1,28 @@
package com.gh.gamecenter.questionsdetail;
import com.gh.gamecenter.baselist.BaseListAdapter;
import com.gh.gamecenter.baselist.ListFragment;
import com.gh.gamecenter.entity.NewsEntity;
import java.util.List;
import rx.Observable;
/**
* Created by khy on 7/12/17.
*/
public class QuestionsInviteFragment extends ListFragment {
private QuestionsInviteAdapter mAdapter;
@Override
public Observable<List<NewsEntity>> provideDataObservable() {
return null;
}
@Override
protected BaseListAdapter provideListAdapter() {
return mAdapter == null ? mAdapter = new QuestionsInviteAdapter(getContext(), this) : mAdapter;
}
}

View File

@ -0,0 +1,32 @@
package com.gh.gamecenter.questionsdetail;
import android.view.View;
import android.widget.TextView;
import com.facebook.drawee.view.SimpleDraweeView;
import com.gh.base.BaseRecyclerViewHolder;
import com.gh.base.OnListClickListener;
import com.gh.gamecenter.R;
import butterknife.BindView;
/**
* Created by khy on 7/12/17.
*/
public class QuestionsInviteItemViewHolder extends BaseRecyclerViewHolder {
@BindView(R.id.questionsinvite_item_icon)
public SimpleDraweeView mIcon;
@BindView(R.id.questionsinvite_item_name)
public TextView mName;
@BindView(R.id.questionsinvite_item_answercount)
public TextView mAnswercount;
@BindView(R.id.questionsinvite_item_votecount)
public TextView mVotecount;
@BindView(R.id.questionsinvite_item_invite)
public TextView mInvite;
public QuestionsInviteItemViewHolder(View itemView, Object data, OnListClickListener listClickListener) {
super(itemView, data, listClickListener);
}
}

View File

@ -0,0 +1,23 @@
package com.gh.gamecenter.questionsdetail;
import android.view.View;
import android.widget.TextView;
import com.gh.base.BaseRecyclerViewHolder;
import com.gh.base.OnListClickListener;
import com.gh.gamecenter.R;
import butterknife.BindView;
/**
* Created by khy on 7/12/17.
*/
public class QuestionsInviteTopItemViewHolder extends BaseRecyclerViewHolder {
@BindView(R.id.questionsinvite_top_item_invite)
public TextView mInvite;
public QuestionsInviteTopItemViewHolder(View itemView, Object data, OnListClickListener listClickListener) {
super(itemView, data, listClickListener);
}
}